2016-07-21 2 views
0

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

my_package 
| 
+--__init__.py 
| 
+--setup.py 
| 
+--module.py 
| 
+--sub_package 
    | 
    +--__init__.py 
    | 
    +--script.py 

Сценарий script.py необходимо импортировать функции из module.py, и мне нужно, чтобы иметь возможность запускать script.py с помощью интерпретатора Python ,

Я знаю, что Гвидо называет это «анти-шаблон». И я знаю, что у вас есть 10 причин, почему я не должен этого делать. Я, вероятно, согласен с большинством из них - действительно, я знаю. Я бы не стал задавать этот вопрос, могу ли я избежать этого. Так что мы можем просто пропустить часть, в которой мы переходим, почему это плохо и перейти к решению? Благодаря!

Я также знаю, что есть около 1000 других вопросов, связанных с этим. Я, наверное, сейчас их прочитал. Большинство из них были устарели из-за изменений в системе импорта Python, а остальные просто не правы.

То, что я пробовал:

  • Использование from .module import my_function в script.py, а затем либо работает python script.py внутри каталога sub_package или python sub_package/script.py внутри каталога my_package. В любом случае, я получаю ошибку:

SystemError: Parent module '' not loaded, cannot perform relative import

  • Использование from module import my_function или from my_package.module import my_function и работает script.py, как описано выше (или из sub_package или my_package). Я получаю:

ImportError: No module named 'module'

(или аналогично с my_package вместо module)

  • Запуск python -m sub_package/script из каталога my_package или python -m my_package/sub_package/script из родительского каталога my_package. Я получаю:

No module named sub_package/script

(или аналогично с my_package/sub_package/script)

Есть ли что-нибудь еще я должен попробовать? Я бы действительно скорее избегать возиться с sys.path или PYTHONPATH по целому ряду причин.

+0

Вы можете написать свою функцию __init__.py или родительскому модулю, а затем попытаться импортировать my_function –

+0

Вы читали [_Релегирующий импорт за миллиардный раз_] (http://stackoverflow.com/questions/14132789/relative-imports- для-миллиардное время)? – martineau

+0

@martineau Да: это был один из вопросов, который привел к моей третьей попытке ('python -m ...'). Единственное другое полезное предложение, которое я видел в этом, заключалось в том, что он возился с 'sys.path', который вообще опасен (и в конкретном случае, который мотивирует этот вопрос). –

ответ

0

Я считаю, что вы можете просто сказать

import module 

изнутри script.py, если вы выполните следующие действия:

с вашего терминала в пробеге каталоге MyPackage:

$ python setup.py install 

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

$ python setup.py install 

каждый раз, когда вы вносите изменения в module.py, но если вы хорошо с этим этот метод должен работать

0

В самом деле, интерпретатор python найдет модуль в sys.path.It означает, что если вы добавите каталог вашего модуля в этом примере «somepath/my_package» в sys.path, python найдет его с помощью «модуля импорта».

Итак, как достичь этой цели?

Если ваш каталог абсолютный путь никогда не изменится, вы можете сделать это ниже:

sys.path.append(yourAbsPath) 

Но иногда путь к директории может измениться, но относительный путь не будет change.So я рекомендую следовать этому, попробуйте чтобы добавить его в начале вашего script.py:

import sys 
import os 
my_packagePath = os.path.dirname(os.path.dirname(__file__)) 
sys.path.append(my_packagePath) 
import module 
#from module import yourFunction #replace yourFunction with your real function 

в CMD инструмента, просто введите "abspath Python yourScript.py в".