2016-08-17 10 views
2

Awesome_stuff/my_moduleには、my_algorithm.py,my_settings.py,my_utils.pyというファイルが含まれているとします。どんな問題を作成しませんpython my_algorithm.pyを実行サブモジュールを同じPythonモジュール内で互いに見えるようにする

# my_algorithm.py 
import my_utils as mu 
from my_settings import My_settings 

def alg(): 
    # do something 

if __name__ == "__main__": 
    alg() 

: メインファイルmy_algorithm.pyには、次の行が含まれています。しかし、私がPythonライブラリにこのモジュールをインストールしたいのであれば、変更されます。

from setuptools import setup 

setup(
    name = 'Awesome_stuff', 
    version = '1.0.0', 
    packages = ['my_module'], 
    # # dependencies 
    install_requires = ['numpy','scipy', 'numpydoc>=0.5', 'pyomo>=4.3.11388', 'mock>=1.1.3'], 
    # # project metadata 
    author = 'Me', 
    author_email = '[email protected]', 
    description = 'This module contains awesome stuff', 
    license = 'BSD', 
    url = 'http://my_website.com', 
    download_url = 'my_download_address.com' 
) 

python setup.py installを実行すると、卵を生成し、モジュールは、私のPythonでインストールされています:私はmy_moduleフォルダmy_moduleフォルダ内と外の空の__init__.pyファイルを追加したことを行うためには、私はこのようになりますsetup.pyファイルを配置しましたとしょうかん。今、メインフォルダAwesome_stuffは含まれています。私は今from my_module.my_algorithm import *のようなものが含まれている新しいPythonのファイルtest.pyを作成することができ、元のpython my_algorithm.pyと同等のものを実行するために

Awesome_stuff.egg-info 
build (folder created during installation) 
dist (folder created during installation) 
my_module (my original folder plus __init__.py) 
setup.py 

、その後はalg()を実行します。

残念ながら、ラインfrom my_module.my_algorithm import *次のエラーを生成します。

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "build/bdist.macosx-10.11-intel/egg/my_module/my_algorithm.py", line 25, in <module> 
ImportError: No module named my_utils 

私は、元の3つのモジュールのファイルを変更せずにこの問題を解決するにはどうすればよいですか?私はここで何がうまくいかないのか分かりません。

さらに、import my_moduleはエラーを生成しません。私はここで少し混乱している。 モジュールがスタンドアロンのフォルダであってもPythonライブラリにインストールされても機能しなかった場合、同じフォルダからサブモジュールをインポートするのはなぜですか?

もっと一般的な質問:お互いに依存する可能性のあるサブモジュールをインポート/処理する正しい/提案された方法は何ですか?この場合、ファイル__init__.pyが役割を果たす可能性がありますか?

ありがとうございました。例として

OS Xエルキャプテン、パイソン2.7.10

EDIT

、私は同様に構成されているPythonライブラリZen、見た:

Zen 
    build 
    zen 
     folder1 
     folder2 
     ... 
     __init__.py 
     graph.pxd 
     graph.pyx 
     digraph.pxd 
     digraph.pyx 
     ... 
    Makefile 
    setup.py 

この場合、(これは、graph.pxd宣言の一部を上書きします)には、from graph cimport *という行が含まれていますが、問題はありません。それが言うわけではありません:from zen.graph cimport *

LAST EDIT

cimportを使用する場合は、あなたが*.pxdファイルのパスを設定するためにsetup.py内部package_dataを定義することができます。このため、上記の例ではcimportに絶対インポートは必要ありません。しかし、これは私の知る限りでは*.pyファイルでは不可能です。唯一の方法は、絶対および相対インポートを使用することです。

答えて

3

__init__.pyファイルを追加したので、あなたはパッケージを作成しました。だから今、あなたはパッケージからインポートするときに、そのパッケージ名を使用する必要があります。

# my_algorithm.py 
import my_module.my_utils as mu 
from my_module.my_settings import My_settings 

def alg(): 
    # do something 

if __name__ == "__main__": 
    alg() 
+0

はい、これは問題を解決するだろうが、それは行くための正しい方法は思えません。モジュールとサブモジュールの名前空間と階層は、モジュールを正式に作成する前後で同等でなければなりません。それ以外の場合は、モジュールを作成することに決めたので、 'import ...'をすべて修正しなければなりません。 – Gioker

+0

@Giokerはい、まあ、そうではありません。ごめんなさい。 '__init__'を追加する前に、適切な名前空間がありません。あなたはモジュールを作成していません。あなたはすでに別々のモジュールを持っていました。あなたはそれをパッケージにまとめました。 –

+0

@Giokerの絶対インポートは、お勧めの方法です: https://www.python.org/dev/peps/pep-0008/#imports –

関連する問題