2

私はpythonとvirtualenv/pipを使用しています。pip を介してモジュールをインストールしましたtest_utils(これは django-test-utils です)。私のdjangoアプリの1つに、そのモジュールをインポートしたいと思います。ただしtest_utils.py、同じディレクトリに別のファイルもあります。に行くimport test_utilsと、このローカル ファイルがインポートされます。

Python に非ローカル/非相対/グローバル インポートを使用させることは可能ですか? の名前を変更できると思いますがtest_utils.py、興味があります。

4

6 に答える 6

5

sys.pathを変更すると、検索順序を切り替えることができます。

del sys.path[0]
sys.path.append('')

これにより、現在のディレクトリがシステム検索パスの後に配置されるため、ローカルファイルが標準モジュールをシャドウイングすることはありません。

于 2011-03-14T13:43:48.683 に答える
1

私の問題はさらに複雑でした:

同じ名前のファイルからglobal/site-packagesモジュールをインポートする

aero の pm リサイクラーに取り組んでいて、特にpip.commands.search.SearchCommandソース ファイル pip.py のアダプター クラス Pip から、pip API にアクセスしたかったのです。

この場合、変更しようとしても無駄です。完全に消去して、フォルダーを唯一のアイテムとして追加するsys.pathことさえしましたが、うまくいきませんでした。sys.path.../site-packages/pip...egg/sys.path

私はまだ得ます:

print pip.__package__
# 'aero.adapters' 

最終的にうまくいく2つのオプションを見つけました。それらはあなたにも同じようにうまくいくはずです:

__builtin__.__import__()組み込み関数の使用

global_pip = __import__('pip.commands.search', {}, {}, ['SearchCommand'], -1)
SearchCommand = global_pip.SearchCommand

ただし、ドキュメントを読むと、代わりに次の方法を使用することをお勧めします。

conv ラッパーを使用importlib.import_module()します。__import__

ドキュメントimport_module()では、2.7 から 3.1 への移行を容易にするために、Python 3.1 の機能のマイナー サブセットであると説明しています。

from importlib import import_module
SearchCommand = import_module('pip.commands.search').SearchCommand

import_module()あなたが私に尋ねると、間違いなくよりPythonicに感じますが、どちらのオプションも仕事を成し遂げます。

nJoy!

于 2012-12-05T01:08:31.733 に答える
0

あなたはあなたのをリセットすることができますsys.path

import sys
first = sys.path[0]
sys.path = sys.path[1:]
import test_utils
sys.path = first + sys.path

の最初のエントリsys.pathは「常に」(「デフォルトごと」のように:python docsを参照)の現在のディレクトリであるため、削除するとグローバルインポートが実行されます。

于 2011-03-14T13:43:25.320 に答える
0

test_utilsはdjangoプロジェクトに参加していたのでfrom ..test_utils import ...、グローバルなものをインポートすることができました。

于 2011-03-18T11:02:30.300 に答える