2016-06-11 2 views
1

Я - студент, изучающий компьютерную науку первого года, в настоящее время работаю над небольшим проектом, который я сохраняю в Dropbox для школы.Как правильно импортировать во время разработки пакета python?

Я заранее извиняюсь за потенциально тривиальный вопрос. Но, не имея никакого опыта и после того, как я пробовал все методы отладки, меня учили, Im действительно застрял!

Он имеет следующую структуру файловой

school_project/ 
    __init__.py  #(empty) 
    main_functions/ 
     __init__.py #(empty) 
     render.py 
     filter.py 
    helper_functions/ 
     __init__.py #(empty) 
     string.py 
     utility.py 

В настоящее время, мне нужно использовать функции, основанные в utility.py в файле render.py. Моя первая попытка решить эту проблему состояла в том, чтобы сделать import ..helper_functions.utility в файле render.py.

К сожалению, сообщение было сообщено об ошибке.

import ..helper_functions.utility 
    ^
SyntaxError: invalid syntax 

Во-первых, я не знаю, почему этот относительный импорт не работает.

Во-вторых, следует ли вместо этого использовать абсолютный импорт? В форме import school_project.helper_functions.utility? Если да, то мне тогда нужно будет добавить каталог, в котором school_project/ в настоящее время находится в PYTHONPATH? Как мне это сделать?

бы я просто изменить мой компьютер PATH и PYTHONPATH будет соответствующим образом адаптироваться? Или они являются отдельными сущностями, и этот процесс немного задействован? Ive посмотрел на другие потоки, но все они, кажется, изменяют PYTHONPATH во время выполнения самого скрипта python, что я вижу как гигантское потенциальное происхождение ошибок в будущем.

ответ

1

Это так, как вы должны это сделать:

from ..helper_functions import utility 

Это не будет работать, если вы запустите программу питона обычно из-за относительный импорт.

Это путь вы должны запустить его:

python3 -m helper_functions.utility 

Но это несколько многословно, и не очень хорошо смешивать с притоном линией, как #/USR/бен/окр python3!.

Хотя это не уникально. Ваша структура пакета более сложная. Вам нужно будет указать каталог, содержащий каталог вашего пакета в PYTHONPATH, и сделать это вот так.

из mypackage.mymodule импорта as_int

Вы также можете сделать это. Но это не рекомендуется для начинающих. Вы просто frob PYTHONPATH в коде сначала с этим ...

import sys 
import os 

PACKAGE_PARENT = '..' 
SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__)))) 
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT))) 

from mypackage.mymodule import as_int 
+0

Спасибо за ответ. Ошибка не исчезла. Такая же синтаксическая ошибка, но теперь она указывает на период '.' между' helper_functions' и 'utility' – AlanSTACK

+1

Похоже, мы получаем прогресс :) –

+0

Попробуйте следующее:' from ..helper_functions import utility' –

0

Абсолютные импорт рекомендуется Пеп 8:

Absolute imports are recommended, as they are usually more readable and tend to be better behaved (or at least give better error messages) if the import system is incorrectly configured (such as when a directory inside a package ends up on sys.path):

Что касается PYTHONPATH, установив его один раз в терминальной сессии, где вы работаете над проектом может быть лучше на данный момент. После того, как вы продолжите использовать IDE, например, pycharm, вам будет автоматически управляться

+1

Относительный импорт больше не так обескуражен, см. Этот ответ: https://stackoverflow.com/questions/4209641#answer-16748366 – Pawamoy

+1

Эта фраза не включена в [текущую ревизию pep8] (https: //www.python .org/DEV/Peps/PEP-0008 /). Вместо этого он говорит об этом: рекомендуется импортировать импорт _Absolute, поскольку они обычно более читабельны и, как правило, лучше себя ведут (или, по крайней мере, дают более эффективные сообщения об ошибках), если система импорта неправильно настроена (например, когда каталог внутри пакета заканчивается sys.path): _ –

+0

Обновлено, спасибо. – renemilk

Смежные вопросы