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
ファイルでは不可能です。唯一の方法は、絶対および相対インポートを使用することです。
はい、これは問題を解決するだろうが、それは行くための正しい方法は思えません。モジュールとサブモジュールの名前空間と階層は、モジュールを正式に作成する前後で同等でなければなりません。それ以外の場合は、モジュールを作成することに決めたので、 'import ...'をすべて修正しなければなりません。 – Gioker
@Giokerはい、まあ、そうではありません。ごめんなさい。 '__init__'を追加する前に、適切な名前空間がありません。あなたはモジュールを作成していません。あなたはすでに別々のモジュールを持っていました。あなたはそれをパッケージにまとめました。 –
@Giokerの絶対インポートは、お勧めの方法です: https://www.python.org/dev/peps/pep-0008/#imports –