0
  • 私は、日常業務用のpython スクリプトのコレクションに取り組んでいます。
  • 重複を避けるために、インポートを利用していくつかのツールを共有したいと考えています。
  • を保持するためにrepository maintainable特定の目的のためにスクリプトを収集するためのサブフォルダーとlib-folder、共有機能を保持するための各サブフォルダー内の があります。

構造はこんな感じ。

root
├── lib
│   ├── hello.py
└── sub
    ├── hello_user.py
    └── lib

__init__.py files exist, but are filtered for better readability

hello_user.py のコードは次のとおりです。

from lib.hello import hello
hello()

そしてhello.pyで:

def hello():
    print("Hello")
  • PYTHONPATHは に設定されていroot folderます。
  • 「python sub/hello_user.py」を実行しようとすると、「ImportError: No module named hello」というエラーが表示されます。sub/lib の名前を sub/lib_hide に変更すると、期待される出力 "Hello" が得られます。
  • root/sub/ libではなくroot/libから Python をインポートするにはどうすればよいですか?
  • PYTHONPATH to "root/.."と の設定importing "root.lib"は機能しますが、おそらく実行可能なオプションではありません (スクリプトを使用するすべてのセットアップと既存のすべてのスクリプトで変更が必要になります)。
  • を変更するだけのソリューションをお勧めしimport statementます。relative path相対パスは問題ありませんが、親フォルダーに名前を付けるにはどうすればよいですか? 「..」。lib.helloが機能しません。
4

2 に答える 2

1

を使用してスクリプトを実行するとpython sub/hello_user.py、ディレクトリが最初の要素としてsub自動的に追加されます。sys.pathしたがって、ポイントに関係なく、root/sub/lib前に検出されるため、非表示にします。これを変更する唯一の方法は、パスの前に表示されるようにすることです。root/libPYTHONPATHrootroot/sub

sys.path.insert(0, '.../root')

モジュールをインポートする (または を使用してモジュールを直接実行するpython -m sub.hello_user) 場合は、状況が異なります。

python2 では、インポートは暗黙的に相対と見なされるため、インポートしようとしますがroot/sub/lib/hello.pyroot/lib再び によってシャドウされroot/sub/libます。

Python3 は、インポートをデフォルトで絶対にすることでこれを修正するため、 import root/lib/hello.py. 次を追加することにより、python2でこの動作を取得できますfrom __future__ import absolute_import

# root/sub/hello_user.py:

from __future__ import absolute_import
from lib import hello      # imports root/lib/hello.py
from sub.lib import hello  # imports root/sub/lib/hello.py
from .lib import hello     # same, but relative import instead of absolute

ただし、これはsub以前のパスにない場合にのみ機能しrootます。

于 2013-07-31T08:06:50.770 に答える
0

roor/lib フォルダーを sys.path に挿入してみてください。

import sys
sys.path.insert(1, 'complete/path/root/lib')

sys.path は、「モジュールの検索パスを指定する文字列のリストです。環境変数 PYTHONPATH と、インストールに依存するデフォルトから初期化されます」( http://docs.python.org/2/library/sys.htmlから) ?highlight=sys.path#sys.path )。

2 つのコメント: sys.path[0] はそのままにしておくことをお勧めします (したがって 1)。現在のフォルダーである最初の (0) は予期される動作であるためです。次に、必要なパスを sys.path の最後に追加する sys.path.append があります (必要なものではありません)。

役に立つかもしれないimp lib ray ( http://docs.python.org/2/library/imp ) もあります。

お役に立てば幸いです、P

于 2013-07-31T07:49:14.227 に答える