Импорт пакета Python из родительского каталога

Я имею следующую структуру исходного кода

/testapp/
/testapp/__init__.py
/testapp/testmsg.py
/testapp/sub/
/testapp/sub/__init__.py
/testapp/sub/testprinter.py

гдеtestmsg определяет следующую константу:

MSG = "Test message"

а такжеsub/testprinter.py:

import testmsg

print("The message is: {0}".format(testmsg.MSG))

Но я получаюImportError: No module named testmsg

Разве это не должно работать, так как структура пакета? Я действительно не хочу расширять sys.path в каждом подмодуле, и я даже не хочу использовать относительный импорт.

Что я здесь не так делаю?

 Simeon Visser09 июл. 2012 г., 12:46
Как вы выполняете код?
 user154386309 июл. 2012 г., 14:43
@SimeonVisser работаетpython sub/testprinter.py, но такжеpython testprinter.py вsub каталог не работает.

Ответы на вопрос(3)

from .. import testmsg
 09 июл. 2012 г., 13:02
CodeShining, посмотрите на решение Dido для Python 3.5 PEP-328 для стандарта.link
 09 июл. 2012 г., 12:49
но, будучи пакетом, он не должен работать так, как ожидалось? Я бы не использовал родственника, если ожидалось, что он сработает

Как импортировать файл Python в родительский каталог

import sys
sys.path.append(path_to_parent)
import parent.file1

Вот что я сделал, чтобы импортировать что угодно. Конечно, вы все равно должны скопировать этот скрипт в локальные каталоги, импортировать его иuse путь, который вы хотите.

import sys
import os

# a function that can be used to import a python module from anywhere - even parent directories
def use(path):
    scriptDirectory = os.path.dirname(sys.argv[0])  # this is necessary to allow drag and drop (over the script) to work
    importPath = os.path.dirname(path)
    importModule = os.path.basename(path)
    sys.path.append(scriptDirectory+"\\"+importPath)        # Effing mess you have to go through to get python to import from a parent directory

    module = __import__(importModule)
    for attr in dir(module):
        if not attr.startswith('_'):
            __builtins__[attr] = getattr(module, attr)
Решение Вопроса

run, Путь этого сценария будет автоматически добавлен в путь поиска Python.

Сделайте следующую структуру:

TestApp/
TestApp/README
TestApp/LICENSE
TestApp/setup.py
TestApp/run_test.py
TestApp/testapp/__init__.py
TestApp/testapp/testmsg.py
TestApp/testapp/sub/
TestApp/testapp/sub/__init__.py
TestApp/testapp/sub/testprinter.py

Тогда бегиTestApp/run_test.py first:

from testapp.sub.testprinter import functest ; functest()

затемTestApp/testapp/sub/testprinter.py может сделать:

from testapp.testmsg import MSG
print("The message is: {0}".format(testmsg.MSG))

Больше хороших советовВот;

 09 июл. 2012 г., 14:44
может ли это зависеть от того факта, что я не генерировал файл setup.py? Я имею в виду, что я следовал структуре пакета python, но я не генерировал метод установки, предполагая, что он также может работать без необходимостиsetup.py install Это.
 09 июл. 2012 г., 20:30
@CodeShining, нет, это не имеет значения. Я включил толькоsetup.py в примере для наглядности. Что действительно имеет значение, как я сказал в первом абзаце ответа, так этоwhich file you're running in first place, Если вы запустите (запустите) файл внутри пакета, он не увидит пакет. Поэтому хорошей практикой является использование основного сценария (который выrun) вне пакета.

Ваш ответ на вопрос