Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Не выполняйте относительный импорт.

От PEP8:

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

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

Update: "Python 2.6 и 3.x поддерживают надлежащий относительный импорт (...)". Подробнее см. Dave.

Ответ 2

EDIT Nov 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" модуль.

Ответ 3

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

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

Ответ 4

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

#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

Ответ 5

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

в сочетании с командой 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, просто вот так:

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

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