проблема в питоне относительного импорта - PullRequest
0 голосов
/ 24 августа 2011

Я запускаю следующий проект в Windows со следующей структурой каталогов ..

Project\Src\Lib\General\Module_lib.py  
Project\Src\executables\example.py

Теперь я хочу импортировать Module_lib.py в example.py .. Пожалуйста, помогите мне, как решить эту проблему?

содержание example.py:

from ..lib.general.Module_lib import Module_lib  

вывод:

Value Error : Attempted relative import in non-packages

Каков наилучший способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

Вам необходимо определить переменную среды PYTHONPATH, чтобы она содержала все каталоги, в которых вы хотите, чтобы Python искал ваши модули.Предполагая, что ваше исходное дерево находится в корне диска C: у вас есть два варианта:

  1. Добавить все листовые каталоги в PYTHONPATH и импортировать ваши модули напрямую, например:

    set PYTHONPATH=C:\Project\Src\Lib\General
    

    В этом случае вы можете импортировать ваш модуль напрямую:

    import Module_lib
    
  2. Создайте пакеты из ваших каталогов, добавив пустые файлы с именем __init__.py, чтобы вы могли использовать полные именаимпортировать ваши модули и иметь меньше каталогов для добавления в вашу PYTHONPATH.Вы можете сделать что-то вроде:

    set PYTHONPATH=C:\Project\Src
    

    В этом случае вы можете импортировать ваш модуль с подходящим квалифицированным именем:

    import Lib.General.Module_lib
    

    Для этого вам нужно добавить пустой файл с именем __init__.py в каталоги C: \ Project \ Src \ Lib и C: \ Project \ Src \ Lib \ General.

0 голосов
/ 24 августа 2011

Добавьте Project\Src\Lib\General к вашему PYTHON_PATH, чтобы среда выполнения могла его найти. Это единственное действительно удобное решение, которое я могу придумать.

Вы можете найти способ добавить свой путь к Python здесь: https://stackoverflow.com/questions/6318156

Также возможно выполнение сценария:

import sys
sys.path.append(os.path.dirname(__file__))

Это не будет работать из коробки, потому что dirname вызов для вашего текущего файла. Чтобы это исправить, вы можете вызывать его несколько раз для перемещения вверх по каталогам. Надеюсь, это достаточно ясно.

dir1 = os.path.dirname(__file__)
dir1up = os.path.dirname(dir1)
dir1upup = os.path.dirname(dir1up)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...