質問: 親フォルダからモジュールをインポートする 私はpython 2.5を実行しています。これは私のフォルダツリーです:ptdraft/ nib.py simulations/ life/ life.py (各フォルダーに__init__.pyもあります。読みやすくするためにここでは省略しています)nibモジュールの中からlifeモジュールをインポートするにはどうすればいいですか?私はそれがsys.pathに手を加えることなく行うことが可能であることを願っています。注:実行されているメインモジュールはptdraftフォルダーにあります。
回答: 簡単な答えを以下に示しますので、小さくてクロスプラットフォームな仕組みを確認できます。 組み込みモジュール(os、sysおよびinspect)のみを使用するため、動作するはずですpythonはそのために設計されているため、任意のオペレーティングシステム(os)で 。回答の短いコード-少ない行と変数from inspect import getsourcefile import os.path as path, sys current_dir = path.dirname(path.abspath(getsourcefile(lambda:0))) sys.path.insert(0, current_dir[:current_dir.rfind(path.sep)]) import my_module # replace "my_module" here with the module name. sys.path.pop(0) これより少ない行については、2行目をimport os.path as path, sys, inspectに置き換え、 getsourcefile(3行目)の先頭にinspect.を追加し、最初の行を削除します。 -ただし、これはすべてのモジュールをインポートするため、より多くの時間、メモリ、リソースが必要になる場合があります。私の答えのコード(longer version)from inspect import getsourcefile import os.path import sys current_path = os.path.abspath(getsourcefile(lambda:0)) current_dir = os.path.dirname(current_path) parent_dir = current_dir[:current_dir.rfind(os.path.sep)] sys.path.insert(0, parent_dir) import my_module # replace "my_module" here with the module name. stack overflow answerの例を使用します 現在のパスを取得する方法 pythonで実行されたファイル? 組み込みツールで実行中のコードのソース(ファイル名)を見つけます。 from inspect import getsourcefile from os.path import abspath 次に、使用するソースファイルを検索する場所で使用します。 abspath(getsourcefile(lambda:0)) 私のコードは、sys.path、pythonパスリストにファイルパスを追加します これにより、pythonがそのフォルダーからモジュールをインポートできるためです。モジュールをコードにインポートした後、sys.path.pop(0)を新しい行で実行することをお勧めします 追加されたフォルダーに、インポートされた別のモジュールと同じ名前のモジュールがある場合 プログラムの後半。他のパスではなく、インポートの前に追加されたリスト項目を削除する必要があります。 プログラムが他のモジュールをインポートしない場合、ファイルパスを削除しない方が安全です。 プログラムが終了(またはpythonシェルを再起動)した後、sys.pathに対して行った編集はすべて消えます。ファイル名変数に関する注意私の答えは、__file__変数を使用して実行中のファイルパス/ファイル名を取得しません コードは、ここのユーザーがしばしばunreliableと記述しているためです。あなたはそれを使うべきではありません 他の人が使用するプログラムの親フォルダーからモジュールをインポートするための。動作しない例( this stack overflowの質問からの引用):•it できません 一部のプラットフォームで見つかりました•時々 ファイルのフルパスではありません py2exeには__file__属性はありませんが、回避策があります execute()を指定してidleから実行すると、__file__属性はありません os x 10.6でnameerror: global name '__file__' is not definedが表示されます