2013-03-12 13 views
19

setup.pyを使用してPythonパッケージをセットアップする際に問題があります。setup.pyを使用してインストールされたパッケージのインポートエラー

maindir 
    |- setup.py 
    |-mymodule 
     |- __init__.py 
     |- mainmodule.py 
     |-subdir 
      |- __init__.py 
      |- submodule.py 

すなわちプロジェクトディレクトリがsetup.py自体に二つのディレクトリに2つのPythonモジュールが含まれているディレクトリmymoduleが、含まれています。まず、私は、次のディレクトリを設定しています。

from .subdir import submodule 
mainstring = "42" 

setup.pyは含まれています:

import os 
from setuptools import setup 
setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=['mymodule'], 
) 

私はipythonfrom mymodule import mainmoduleを行うと動作が期待どおりに動作し、I sourceTest内から ファイルsubmodule.pyが含まれているだけで

teststring = "hello world" 

mainmodule.pyが含まれています例えば参照することができますこれは私に文字列hello worldを与えます。私はpython setup.py installを使用してこの「パッケージ」をインストールし、(他のディレクトリ内から)同じことをしよう、他の側では

、私は、インポートエラーを取得:

In [1]: from mymodule import mainmodule 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 
/home/alexander/<ipython-input-1-cf4c9bafa487> in <module>() 
----> 1 from mymodule import mainmodule 

/home/alexander/build/bdist.linux-i686/egg/mymodule/mainmodule.py in <module>() 

ImportError: No module named subdir 

私は何が表示されません私はGetting started tutorialrules for importing intra-packagesのように間違っています。私の間違いは本当に小さなものだと思うが、私はそれを見つけることができず、助けに感謝する。

答えて

34

あなたがサブパッケージを含め、setup内のすべてのパッケージの一覧を表示する必要があります。

setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=['mymodule', 'mymodule.subdir'], 
) 

または使用することができますsetuptoolsの魔法機能find_packages:これはhereを述べている

from setuptools import setup, find_packages 
setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=find_packages(), 
) 

If you have sub-packages, they must be explicitly listed in packages, but any entries in package_dir automatically extend to sub-packages. (In other words, the Distutils does not scan your source tree, trying to figure out which directories correspond to Python packages by looking for __init__.py files.)

+1

これはどこですか? 'distutils'に' setup'の内容に関するドキュメントがありますか?代表的な文書を見つけるのは容易ではないようです。 – Alex

+0

ドキュメントの例へのリンクを追加しました。 –

+0

サブパッケージが 'packages'にリストされている場合、サブパッケージを見つけるために' package_dir'が再帰的にどのように使われているか詳しく調べるには、read [this](https://docs.python.org/2/ distutils/setupscript.html#listing-whole-packages)をご覧ください。 –

5

あなた各モジュールを明示的に指定する必要があります。毎回setup.pyにモジュールを追加する複雑さを維持するのではなく、のfind_packagesメソッドを使用することができます。デフォルトで

  1. whereすなわち'.'にごCURDIR:

    find_packagesは、2つのオプションの引数を取ります。

を除外するものの

  • excludeリスト私は通常私のレポでテストを持っているので、私が使用:

    from setuptools import find_packages 
    
    packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]), 
    
  • 0

    私は私のsetup.py console_scriptsでscriptname.py:mainを持っていたが、.pyは冗長です。

    関連する問題