Імпарт файла з бацькоўскага каталога?

У мяне ёсць наступная структура каталогаў:

application
    tests
        main.py
    main.py

Дадатак/main.py змяшчае некаторыя функцыі.

Тэсты/main.py будзе ўтрымліваць мае тэсты для гэтых функцый, але я не магу імпартаваць верхні ўзровень main.py. Я атрымліваю наступнае паведамленне пра памылку:

ImportError: Import by filename is not supported.

Я спрабую імпартаваць, выкарыстоўваючы наступны сінтаксіс:

import main

Што я не так раблю?

29
У якім файле вы робіце імпарт галоўную ?
дададзена аўтар Aivar, крыніца
У якім файле вы робіце імпарт галоўную ?
дададзена аўтар Aivar, крыніца
Я прачытаў дакументацыю першай: docs.python.org/2/tutorial/ modules.html # пакеты
дададзена аўтар Blender, крыніца
Я прачытаў дакументацыю першай: docs.python.org/2/tutorial/ modules.html # пакеты
дададзена аўтар Blender, крыніца
Ну вы не можаце імпартаваць такое ж імя файла, з якім вы працуеце.
дададзена аўтар squiguy, крыніца
Ну вы не можаце імпартаваць такое ж імя файла, з якім вы працуеце.
дададзена аўтар squiguy, крыніца

9 адказы

Калі вы хочаце сцэнар быць больш партатыўнымі, разгледзець аўтаматычна знайсці бацькоўскі каталог:

import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# import ../db.py
import db
37
дададзена

Вы павінны дадаць рэж прыкладання на вашым шляху:

import sys
sys.path.append("/path/to/dir")
from app import object

Або ад ракавіны:

setenv PATH $PATH:"path/to/dir"

У выпадку, калі вы выкарыстоўваеце акно: Даданне зменнай у шлях у вокны .

Ці з каманднага радка:

set PATH=%PATH%;C:\path\to\dir
11
дададзена

Вы павінны дадаць рэж прыкладання на вашым шляху:

import sys
sys.path.append("/path/to/dir")
from app import object

Або ад ракавіны:

setenv PATH $PATH:"path/to/dir"

У выпадку, калі вы выкарыстоўваеце акно: Даданне зменнай у шлях у вокны .

Ці з каманднага радка:

set PATH=%PATH%;C:\path\to\dir
11
дададзена

Перш за ўсё, вам трэба зрабіць каталогі ў пакеты, дадаўшы __ __ INIT ру файлы .:

application
    tests
        __init__.py
        main.py
    __init__.py
    main.py

Тады вы павінны пераканацца, што каталог вышэй прыкладання на sys.path . Ёсць шмат спосабаў зрабіць гэта, як зрабіць дадатак infto пакета і ўсталяваць яго, або проста выконваючы рэчы ў патрэбнай тэчцы і г.д.

Тады ваш імпарт будзе працаваць.

9
дададзена
Даданне __ __ INIT. Р вы робіце свае каталогі ў пакеты ня модулі.
дададзена аўтар raben, крыніца

Перш за ўсё, вам трэба зрабіць каталогі ў пакеты, дадаўшы __ __ INIT ру файлы .:

application
    tests
        __init__.py
        main.py
    __init__.py
    main.py

Тады вы павінны пераканацца, што каталог вышэй прыкладання на sys.path . Ёсць шмат спосабаў зрабіць гэта, як зрабіць дадатак infto пакета і ўсталяваць яго, або проста выконваючы рэчы ў патрэбнай тэчцы і г.д.

Тады ваш імпарт будзе працаваць.

9
дададзена
Даданне __ __ INIT. Р вы робіце свае каталогі ў пакеты ня модулі.
дададзена аўтар raben, крыніца

Вы не можаце імпартаваць рэчы з бацькоў/двайнікоў каталогаў як такія. Вы можаце імпартаваць толькі рэчы з каталогаў на сістэмным шляху або бягучага каталога або падкаталогаў ўнутры пакета. Так як у вас няма __ __ INIT. Ру файлы, файлы не ўтвараюць пакет, і вы можаце імпартаваць іх толькі шляхам размяшчэння іх на сістэмным шляху.

4
дададзена
+ Пасля праходжання праз шмат SOQ я зразумеў, што пітон сьляпы шукаць у бацькоўскіх каталогах.
дададзена аўтар sakhunzai, крыніца
@BryanOakley: Гэта падпадае пад тое, што я сказаў пра «размяшчаючы іх на сістэмным шляху».
дададзена аўтар BrenBarn, крыніца
Кажучы без кваліфікацыі, што вы не можаце гэта трохі моцным. Вы не можаце зрабіць гэта без трохі дадатковых намаганняў, але ўсё, што вам трэба зрабіць, гэта паставіць бацькоўскі каталог на шляху, і вы можаце зрабіць гэта.
дададзена аўтар Bryan Oakley, крыніца

Вы не можаце імпартаваць рэчы з бацькоў/двайнікоў каталогаў як такія. Вы можаце імпартаваць толькі рэчы з каталогаў на сістэмным шляху або бягучага каталога або падкаталогаў ўнутры пакета. Так як у вас няма __ __ INIT. Ру файлы, файлы не ўтвараюць пакет, і вы можаце імпартаваць іх толькі шляхам размяшчэння іх на сістэмным шляху.

4
дададзена
+ Пасля праходжання праз шмат SOQ я зразумеў, што пітон сьляпы шукаць у бацькоўскіх каталогах.
дададзена аўтар sakhunzai, крыніца
@BryanOakley: Гэта падпадае пад тое, што я сказаў пра «размяшчаючы іх на сістэмным шляху».
дададзена аўтар BrenBarn, крыніца
Кажучы без кваліфікацыі, што вы не можаце гэта трохі моцным. Вы не можаце зрабіць гэта без трохі дадатковых намаганняў, але ўсё, што вам трэба зрабіць, гэта паставіць бацькоўскі каталог на шляху, і вы можаце зрабіць гэта.
дададзена аўтар Bryan Oakley, крыніца

у пітона. існуе той жа каталог, .. для бацькоўскага каталога імпартаваць файл з бацькоўскага каталога, вы можаце выкарыстоўваць ..

<�Р> з .. імпарт файла (без пашырэння .py)
1
дададзена
Гэта не працуе для мяне, ValueError: Замах адносны імпарт у не-пакет
дададзена аўтар nobism, крыніца
Гэта не працуе для мяне
дададзена аўтар Thiago, крыніца

у пітона. існуе той жа каталог, .. для бацькоўскага каталога імпартаваць файл з бацькоўскага каталога, вы можаце выкарыстоўваць ..

<�Р> з .. імпарт файла (без пашырэння .py)
1
дададзена
Гэта не працуе для мяне, ValueError: Замах адносны імпарт у не-пакет
дададзена аўтар nobism, крыніца
Гэта не працуе для мяне
дададзена аўтар Thiago, крыніца