38

私は次のソースコード構造を持っています

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

wheretestmsgは、次の定数を定義します。

MSG = "Test message"

sub/testprinter.py:

import testmsg

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

しかし、私は得ていますImportError: No module named testmsg

パッケージの構造からして、うまくいくはずがありませんか? 各サブモジュールで sys.path を拡張したくありませんし、相対インポートも使用したくありません。

ここで何が間違っていますか?

4

5 に答える 5

27

すべては、実行するスクリプトによって異なります。そのスクリプトのパスは、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 最初に実行します:

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))

ここにもっと良いヒントがあります;

于 2012-07-09T10:51:08.577 に答える
11

以下のように相対インポートを使用します

from .. import testmsg
于 2012-07-09T10:47:33.337 に答える
10

この質問には答えがあります - 動的インポート:

親ディレクトリに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)
于 2012-10-13T03:15:25.187 に答える