12

次の構造のディレクトリに完全に含まれているpythonプログラムがあります。

myprog/
├── __init__.py
├── __main__.py
├── moduleone.py
└── moduletwo.py

これをパッケージ化して配布できるようにして、別の開発者がpip install -e /path/to/git/clone/of/myprog自分のプログラムに myprog をインポートしてクールなことを実行できるようにしたいと考えています。

また、次のようにコマンド ラインで myprog を実行できるようにしたいと考えています。

PROMPT> python myprog

これを行うと、Pythonが__main__.pyモジュールを実行することを期待しています。ただし、このモジュールは、で宣言され__init__.py、プログラムがコマンド ラインで実行されるときと別のプログラムによってインポートされるときの両方で使用可能である必要があるいくつかの関数への参照を作成します。ただし、次のエラーが発生します。

NameError: name 'function_you_referenced_from_init_file' is not defined

これらの関数を何らかの形でインポートする必要があり__main__.pyますか?

次のように簡単な例を試しました。

PROMPT> cat myprog/__init__.py
def init_myprog():
    print 'running __init__.init_myprog()'

PROMPT> cat myprog/__main__.py
import myprog
print 'hi from __main__.py'
myprog.init_myprog()

PROMPT> ls -l myprog
total 16
-rw-r--r--  1 iit    63B Aug 30 11:40 __init__.py
-rw-r--r--  1 iit    64B Aug 30 12:11 __main__.py

PROMPT> python myprog
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/Users/jon/dev/myprog/__main__.py", line 1, in <module>
    import myprog
ImportError: No module named myprog
4

3 に答える 3

14

は、パッケージ__init__.pyをインポートするときにのみロードされます。代わりに、ディレクトリを実行することにより、ディレクトリをscriptとして扱っています。

ただし、ディレクトリではなく、パッケージをスクリプトとして扱うこともできます。スイッチを使用して、ディレクトリをパッケージメイン スクリプトの両方として扱うには、次のようにします。-m

python -m myprog
于 2013-08-30T16:42:02.273 に答える
10

これらの関数を何らかの形でインポートする必要があり__main__ますか?

はい。のアイテムのみbuiltinsが輸入なしで入手可能です。何かのようなもの:

from myprog import func1, func2

トリックを行う必要があります。

通常の python パスにインストールしていない場合はmyprog、次のような方法で回避できます。

import sys
import os
path = os.path.dirname(sys.modules[__name__].__file__)
path = os.path.join(path, '..')
sys.path.insert(0, path)
from myprog import function_you_referenced_from_init_file

率直に言って、これは恐ろしいことです。

MartijnPieters の提案に従い-m、コマンド ラインに を配置することをお勧めします。この場合、次の__main__.pyようになります。

from myprog import function_you_referenced_from_init_file
于 2013-08-30T15:31:47.657 に答える
3

それで、他の回答を見てわくわくしていなかったので、私は試しました:

from __init__ import *

私の__main__.pyファイルから。

モジュールを名前で参照することはできないと思いますが、単純なケースではうまくいくようです。

于 2015-01-20T20:29:51.833 に答える