0

インポートの問題が原因で、インストールした Python スクリプトの実行に問題があります。

次のようなパッケージ構造があります。

MANIFEST.in
setup.py
bin/opal.py
bin/opal/
   /__init__.py
   /__init__.pyc
   /core.py
   /core.pyc        
   /io.py
   /file.py
   /import_limesurvey.py
   /dictionary.py
   /io.pyc
   /importer.pyc
   /data.py
   /rest.py

rest.py には 1 つのクラスがあります。

class OpalRestCommand:
  ...

opal.py ファイルは、このモジュールを次のように使用します。

import opal.rest
...
restCmd = opal.rest.OpalRestCommand()

これはセットアップ定義です:

...
setup_args = get_kw(
    name=PACKAGE_NAME,
    version=VERSION,
    author=AUTHOR,
    author_email=AUTHOR_EMAIL,
    maintainer=MAINTAINER,
    maintainer_email=MAINTAINER_EMAIL,
    url=URL,
    license=LICENSE,
    description=DESCRIPTION,
    long_description=DESCRIPTION_LOG,
    platforms=PLATFORMS,
    packages = ['opal', 'opal.protobuf']
    package_dir = {'opal': 'bin/opal'}
    scripts=['bin/opal.py']
)

...

if __name__ == '__main__'
   # do some manipulation with argv
   apply(setup, (), setup_args)

これをクライアント マシン (MAC) にインストールして opal.py コマンドを実行すると、常に次のエラーが発生します。

 ImportError: No module name rest

ただし、rest モジュールを使用するテスト プログラムを作成すると、インポートの問題は発生しません。私は Python の初心者です。インストールされたスクリプトに対して何か特別なことをする必要があるかどうかわかりません。opal.py スクリプトは、テスト プログラムと同じ方法で残りのモジュールを見つける必要があると想定しました。

どんな助けでも大歓迎です。

乾杯。

4

1 に答える 1

0

Pythonのインポートパスを適切に尊重していないことに気付く前に、自分のプロジェクトでこの問題に取り組むのに少し時間を費やしました。

実行しているスクリプトの名前が名前空間のルートと一致する場合、名前空間の問題が発生します。opal.py が opal/init.py と競合しています。これは、setuptools をそのまま使用している場合でも発生する可能性があります。

SITEPACKAGES=/usr/lib/pythonX.Y/site-packages とすると、パッケージは $SITEPACKAGES/opal-$version.egg にインストールされ、スクリプトは $SITEPACKAGES/opal-$version.egg/EGG-INFO にインストールされます。 /bin/opal.py ファイルを /usr/local/bin に追加し、EGG-INFO/bin/ に配置されたスクリプトをロードします。そのスクリプトが読み込まれると、小さな問題が発生します。

Python パスには $SITEPACKAGES/opal-$version.egg/EGG-INFO/bin/ が含まれます。インポーターが opal 内で何かをインポートしようとすると、$SITEPACKAGES/opal-$version.egg/opal/ 内のモジュールではなく、実行中のスクリプトがインポートされます。これは、スクリプト名とパッケージに実装されている名前空間が衝突しているためです。

パッケージの名前空間を変更するか、コマンド ライン スクリプト名を変更する必要があります。

于 2013-12-12T22:22:51.260 に答える