Импорт файлов из другой папки - PullRequest
1044 голосов
/ 08 декабря 2010

У меня следующая структура папок.

application/app/folder/file.py

и я хочу импортировать некоторые функции из file.py в другой файл Python, который находится в

application/app2/some_folder/some_file.py

Я пробовал

from application.app.folder.file import func_name

и некоторые другие различные попытки, но до сих пор мне не удавалось правильно импортировать. Как я могу это сделать?

Ответы [ 21 ]

1115 голосов
/ 08 декабря 2010

По умолчанию вы не можете. При импорте файла Python ищет только текущий каталог, каталог, из которого выполняется сценарий точки входа, и sys.path, который включает в себя местоположения, такие как каталог установки пакета (на самом деле это немного сложнее, чем этот, но это охватывает большинство случаев).

Однако вы можете добавить к пути Python во время выполнения:

# some_file.py
import sys
sys.path.insert(0, '/path/to/application/app/folder')

import file
556 голосов
/ 24 февраля 2014

Ничего плохого в:

from application.app.folder.file import func_name

Просто убедитесь, что folder также содержит __init__.py, это позволяет включить его в пакет.Не уверен, почему другие ответы говорят о PYTHONPATH.

74 голосов
/ 15 ноября 2016

Когда модули расположены параллельно, как в вопросе:

application/app2/some_folder/some_file.py
application/app2/another_folder/another_file.py

Эта стенограмма делает один модуль видимым для другого:

import sys
sys.path.append('../')
46 голосов
/ 19 февраля 2014

Я думаю, что специальным способом было бы использовать переменную среды PYTHONPATH, как описано в документации: Python2 , Python3

# Linux & OSX
export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH

# Windows
set PYTHONPATH=C:\path\to\dirWithScripts\;%PYTHONPATH%
35 голосов
/ 22 мая 2018

Первый import sys

 import sys

Второй добавить путь к папке

sys.path.insert(0, '/the/folder/path/name-folder/')

Третий Сделатьпустой файл с именем __ init __.py в вашем подкаталоге (это говорит Python, что это модуль)

  • name-file.py
    • name-folder
      • __init __. py
      • name-module.py

Четвертый импорт модуля в папке

from name-folder import name-module
31 голосов
/ 11 февраля 2017

Ваша проблема в том, что Python ищет этот файл в каталоге Python и не находит его.Вы должны указать, что вы говорите о каталоге, в котором вы находитесь, а не о Python.

Для этого вы измените это:

from application.app.folder.file import func_name

на этот:

from .application.app.folder.file import func_name

Добавляя точку, вы говорите, смотрите в этой папке папку приложения, а не в каталоге Python.

31 голосов
/ 19 февраля 2018

Ответы здесь не ясны, это проверено на Python 3.6

С такой структурой папок:

main.py
|
---- myfolder/myfile.py

Где myfile.py имеет содержание:

def myfunc():
    print('hello')

Оператор импорта в main.py:

from myfolder.myfile import myfunc
myfunc()

и будет напечатано привет .

28 голосов
/ 24 ноября 2014

Из того, что я знаю, добавьте файл __init__.py прямо в папку функций, которые вы хотите импортировать, выполнят эту работу.

19 голосов
/ 15 октября 2015

Учитывая, что application является корневым каталогом для вашего проекта Python, создайте пустой файл __init__.py в папках application, app и folder.Затем в вашем some_file.py внесите следующие изменения, чтобы получить определение func_name:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()
17 голосов
/ 16 августа 2016

работал для меня в python3 на Linux

import sys  
sys.path.append(pathToFolderContainingScripts)  
from scriptName import functionName #scriptName without .py extension  
...