У меня есть папка для моего клиентского кода, папка для моего серверного кода и папка для кода, который является общим для них
Proj/
Client/
Client.py
Server/
Server.py
Common/
__init__.py
Common.py
Как импортировать Common.py из Server.py и Client.py?
python
python-3.x
import
shared-libraries
relative-path
Нарисовался
источник
источник
Ответы:
ИЗМЕНИТЬ ноябрь 2014 г. (3 года спустя):
Python 2.6 и 3.x поддерживает правильный относительный импорт, при котором вы можете избежать любых взломов. С помощью этого метода вы знаете, что получаете относительный импорт, а не абсолютный . '..' означает, что нужно перейти в каталог выше меня:
В качестве предостережения, это будет работать только в том случае, если вы запустите свой python как модуль извне пакета. Например:
Оригинальный хакерский способ
Вы можете добавить Common / в свой sys.path (список путей, которые Python просматривает для импорта):
os.path.dirname(__file__)
просто дает вам каталог, в котором находится ваш текущий файл python, а затем мы переходим к каталогу «Common /» и импортируем модуль «Common».источник
from ...myfile
отправляется../../myfile
Довольно забавно, та же проблема, с которой я только что столкнулся, и я получаю эту работу следующим образом:
в сочетании с командой linux
ln
мы можем упростить задачу:А теперь, если вы хотите импортировать
some_stuff
из файла:Proj/Common/Common.py
в свой файл:,Proj/Client/Client.py
вот так:То же самое относится и к процессу
Proj/Server
, также работает дляsetup.py
процесса, тот же вопрос, который обсуждается здесь , надеюсь, это поможет!источник
Не выполняйте относительный импорт.
Из PEP8 :
Поместите весь свой код в один суперпакет (например, «myapp») и используйте подпакеты для клиента, сервера и общего кода.
Обновление: « Python 2.6 и 3.x поддерживает правильный относительный импорт (...) ». См . Ответы Дэйва для получения более подробной информации.
источник
if __name__ == "__main__":
строки " ". То есть вы хотите иметь возможность использовать их как отдельные скрипты. Как это правильно делать? Я думаю, что это вполне распространенный вариант использования, который следует поддерживать. Почему это не рекомендуется?Выполнение относительного импорта абсолютно нормально! Вот что делает маленький я:
источник
__file__
для получения правильной связи из текущего файлаМетод импорта по умолчанию уже является "относительным" из PYTHONPATH. PYTHONPATH по умолчанию используется для некоторых системных библиотек вместе с папкой исходного исходного файла. Если вы запустите с -m для запуска модуля, текущий каталог будет добавлен в PYTHONPATH. Поэтому, если точка входа вашей программы находится внутри Proj, то использование
import Common.Common
должно работать как внутри Server.py, так и в Client.py.Не делайте относительного импорта. Это не сработает так, как вы хотите.
источник