2012-01-30 13 views
9

"imp"の絶対/相対パスを使用して、同じディレクトリ内の依存関係を持つモジュールをインポートする方法はありますか?impと同じ絶対パス/相対パスの依存関係を持つモジュールをインポートするには?

. 
├── importFrom 
│   ├── dependant.py 
│   └── dependence.py 
└── test.py 

ファイルtest.pyの輸入が使用dependant.py:ここ

は、ディレクトリ構造を次の

import dependence 
:順番に輸入がで直接使うdependence.py

modname=imp.load_source("testImp","importFrom/dependant.py") 

test.pyを呼び出すと

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    modname=imp.load_source("testImp","importFrom/dependant.py") 
    File "importFrom/dependant.py", line 1, in <module> 
    import dependence 
ImportError: No module named dependence 

load_sourceには、ロードされたモジュールへのパスをローダーに追加して、相対的な依存関係を自動的に検出できるようにするのは意味があります。今私が見つけた唯一の選択肢は、test.py

編集に入れて、システムパスに追加されたために :私はパスと相対インポートを行うには良い方法を見つけたが、取得するためにファイルを追加しました(現在の作業ディレクトリからの独立)、呼び出し元の絶対パス

sys.path.append(os.path.join(os.path.dirname(__file__), 'importFrom')) 
import dependant 

答えて

0

IMOこれはload_sourceでは実行できません。これはあなたの 'dependant.py'ファイルのインポートがその親ディレクトリとみなせるように必要なことはしません。

あなたは(モジュール内のディレクトリと絶対的な輸入で__init__.py)が提案されているものを行う、あるいは物事のこの種を可能にする低レベルfind_module/load_module機能を使用する必要がありますいずれか(find_module「パス」引数を参照してください)

+0

を使用しています imp.load_module( "依存"、tup [0]、tup [1]、tup [2] ) "No module named dependence"という同じエラーが返されます。 – a1an

+0

私はそれがpython 2.7のload_sourceで実現可能ではないと思うので、正しい答えは "実現不可能"であり、回避策のアプローチを使用しなければならない – a1an

0

あなたはimportFromディレクトリに__init__.pyを持っている必要があります。

In [5]: ls importFrom/ 
dependance.py dependant.pyc dependence.pyc __init__.pyc 
dependant.py dependence.py __init__.py 

In [6]: from importFrom import dependant 

In [7]: dependant.dependence 
Out[7]: <module 'importFrom.dependence' from 'importFrom/dependence.py'> 

代わりtestdependantをインポートするのは、私は出力を表示するにはPythonインタプリタを使用していました。 dependant.pyには、dependanceがインポートされます。

+1

これは、標準インポートのパスに追加するのを避けることができますが、imp.load_sourceではまだ動作しません。また、インポートするモジュールが完全に異なるディレクトリにある場合にも機能しません。 – a1an

+0

ファイルを作成しましたimportFromディレクトリの__init__.py? – Kracekumar

+0

私は__init__.pyを作成し、import.pyをインポートしました。 importFromディレクトリはtest.pyを持つディレクトリの直接の子であるため、標準インポートでは絶対パスを指定できないため、動作します。 – a1an

関連する問題