881

私はPython 2.5を実行しています。

これは私のフォルダツリーです:

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(各フォルダーにもあり__init__.pyますが、読みやすくするためにここでは省略しています)

nibモジュール内からモジュールをインポートするにはどうすればよいlifeですか? sys.pathをいじらずにできることを願っています。

注: 実行中のメイン モジュールはptdraftフォルダーにあります。

4

27 に答える 27

698

相対インポートを使用できます (python >= 2.5):

from ... import nib

(Python 2.5 の新機能) PEP 328: 絶対インポートと相対インポート

編集:別のドット「。」を追加 2つのパッケージに上がる

于 2009-04-03T16:17:27.513 に答える
399

相対インポート (のようにfrom .. import mymodule) は、パッケージ内でのみ機能します。現在のモジュールの親ディレクトリにある「mymodule」をインポートするには:

import os
import sys
import inspect

currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0, parentdir) 

import mymodule

edit :__file__属性は常に指定されているわけではありません。使用する代わりにos.path.abspath(__file__)、検査モジュールを使用して現在のファイルのファイル名 (およびパス) を取得することを提案しました。

于 2012-06-22T14:30:07.303 に答える
147

この問題は、モジュールが親ディレクトリにあることなどとは関係がないようです。

ptdraftを含むディレクトリを PYTHONPATHに追加する必要があります

あなたはそれがimport nibうまくいったと言っていましたが、それはおそらくあなたptdraft自身(親ではなく)を PYTHONPATH に追加したことを意味します。

于 2009-04-03T14:09:23.840 に答える
105

sys.pathに記載されている「モジュール検索パス」にOS依存のパスを使用できます。したがって、次のように親ディレクトリを簡単に追加できます

import sys
sys.path.insert(0,'..')

親子ディレクトリを追加したい場合は、

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

これは、python 2 と 3 の両方で機能します。

于 2015-02-25T06:37:47.063 に答える
62

モジュール フォルダーを PYTHONPATH に追加してもうまくいかない場合は、Python インタープリターがインポートするモジュールを検索するプログラムのsys.pathリストを変更できます。Python のドキュメントには次のように書かれています。

spamという名前のモジュールがインポートされると、インタープリターは最初にその名前の組み込みモジュールを検索します。見つからない場合は、変数 sys.path で指定されたディレクトリのリストでspam.pyという名前のファイルを検索します。sys.path は次の場所から初期化されます。

  • 入力スクリプトを含むディレクトリ (または現在のディレクトリ)。
  • PYTHONPATH (シェル変数 PATH と同じ構文のディレクトリ名のリスト)。
  • インストールに依存するデフォルト。

初期化後、Python プログラムはsys.pathを変更できます。実行中のスクリプトを含むディレクトリは、標準ライブラリ パスの前の検索パスの先頭に配置されます。これは、ライブラリ ディレクトリ内の同じ名前のモジュールの代わりに、そのディレクトリ内のスクリプトが読み込まれることを意味します。意図した置換でない限り、これはエラーです。

これを知っていれば、プログラムで次のことができます。

import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')

# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft
于 2012-02-17T15:30:55.643 に答える
32

親ディレクトリを sys.path に含めるより一般的なソリューションを次に示します(私にとってはうまくいきます):

import os.path, sys
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
于 2014-02-14T16:09:22.770 に答える
28

pathlib ライブラリ (>= Python 3.4 に含まれています) を使用すると、親ディレクトリのパスを PYTHONPATH に追加することが非常に簡潔で直感的になります。

import sys
from pathlib import Path
sys.path.append(str(Path('.').absolute().parent))
于 2016-03-31T13:08:47.087 に答える
10

import sys sys.path.append('../')

于 2016-09-05T23:07:57.597 に答える
6

過去の回答と同じ種類のスタイル-しかし、より少ない行で:P

import os,sys
parentdir = os.path.dirname(__file__)
sys.path.insert(0,parentdir)

ファイルは、作業している場所を返します

于 2013-10-16T17:25:20.493 に答える
1

別のフォルダーにファイルをインポートする必要があるインポートがある Flask アプリケーションをインポートする必要があるという問題がありました。これは部分的にRemi's answerを使用していますが、次のようなリポジトリがあるとします。

.
└── service
    └── misc
        └── categories.csv
    └── test
        └── app_test.py
    app.py
    pipeline.py

次に、ファイルからアプリ オブジェクトをインポートする前にapp.py、ディレクトリを 1 レベル上に変更します。そのため、アプリをインポートするとき ( pipeline.py.

import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)

os.chdir('../')
from app import app

Flask アプリをインポートした後はos.chdir('./test')、作業ディレクトリが変更されないように使用できます。

于 2020-07-06T11:52:29.100 に答える
0

これを行うためにこのライブラリを作成しました。

https://github.com/fx-kirin/add_parent_path

# Just add parent path
add_parent_path(1)

# Append to syspath and delete when the exist of with statement.
with add_parent_path(1):
   # Import modules in the parent path
   pass
于 2020-07-03T07:31:22.217 に答える