Импорт из относительного пути в Python

У меня есть папка для моего клиентского кода, папка для моего кода сервера и папка для кода, который разделяется между ними

Proj/ Client/ Client.py Server/ Server.py Common/ __init__.py Common.py 

Как импортировать Common.py из Server.py и Client.py?

    Не делайте относительного импорта.

    Из PEP8 :

    Относительный импорт для внутрипакетного импорта сильно обескуражен.

    Поместите весь свой код в один супер-пакет (т. Е. «Myapp») и используйте подпакеты для клиента, сервера и общего кода.

    EDIT Ноябрь 2014 (3 года спустя):

    Python 2.6 и 3.x поддерживают надлежащий относительный импорт, где вы можете избежать хакерства. С помощью этого метода вы знаете, что получаете относительный импорт, а не абсолютный импорт. «..» означает, перейдите в каталог выше меня:

     from ..Common import Common 

    В качестве предостережения это будет работать, только если вы запустите свой python в качестве модуля, вне его. Например:

     python -m Proj 

    Оригинальный взломанный способ

    Этот метод по-прежнему широко используется в некоторых ситуациях, когда вы на самом деле никогда не устанавливаете свой пакет. Например, он популярен среди пользователей Django.

    Вы можете добавить Common / в свой sys.path (список путей, на которые python пытается импортировать вещи):

     import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common')) import Common 

    os.path.dirname(__file__) просто дает вам каталог, в котором находится ваш текущий файл python, а затем мы переходим к «Common /» каталогу и импортируем «Common» модуль.

    Метод импорта по умолчанию уже «относительный», из PYTHONPATH. По умолчанию PYTHONPATH используется для некоторых системных библиотек вместе с папкой исходного исходного файла. Если вы запускаете с -m для запуска модуля, текущий каталог добавляется в PYTHONPATH. Поэтому, если точка входа вашей программы находится внутри Proj, то использование import Common.Common должно работать как внутри Server.py, так и Client.py.

    Не делайте относительного импорта. Он не будет работать, как вы этого хотите.

    Выполнение относительного импорта абсолютно нормально! Вот что мало мне нравится:

     #first change the cwd to the script path scriptPath = os.path.realpath(os.path.dirname(sys.argv[0])) os.chdir(scriptPath) #append the relative location you want to import from sys.path.append("../common") #import your module stored in '../common' import common.py 

    Забавно, одна и та же проблема, с которой я только что познакомился, и получаю эту работу следующим образом:

    в сочетании с командой linux ln , мы можем сделать что-то особенное:

     1. cd Proj/Client 2. ln -s ../Common ./ 3. cd Proj/Server 4. ln -s ../Common ./ 

    И теперь, если вы хотите импортировать some_stuff из файла: Proj/Common/Common.py в свой файл: Proj/Client/Client.py , Proj/Client/Client.py следующие действия:

     # in Proj/Client/Client.py from Common.Common import some_stuff 

    И то же самое относится к Proj/Server , также работает для процесса setup.py , тот же вопрос, который обсуждался здесь , надеюсь, что это поможет!