2049

次のフォルダー構造があります。

application
├── app
│   └── folder
│       └── file.py
└── app2
    └── some_folder
        └── some_file.py

file.pyからいくつかの関数をインポートしたいsome_file.py

私はもう試した

from application.app.folder.file import func_name

など、さまざまな試みが行われましたが、これまでのところ、適切にインポートできませんでした。これどうやってするの?

4

33 に答える 33

1966

注:この回答は、非常に具体的な質問を対象としています。検索エンジンからここに来るほとんどのプログラマーにとって、これはあなたが探している答えではありません。通常、検索パスを変更する代わりに、ファイルをパッケージに構造化します (他の回答を参照)。


デフォルトでは、できません。ファイルをインポートするとき、Python は、エントリポイント スクリプトが実行されているディレクトリのみを検索します。このディレクトリにはsys.path、パッケージのインストール ディレクトリなどの場所が含まれます (実際には、これよりも少し複雑ですが、これでほとんどの場合がカバーされます)。

ただし、実行時に Python パスに追加できます。

# some_file.py
import sys
# insert at 1, 0 is the script path (or '' in REPL)
sys.path.insert(1, '/path/to/application/app/folder')

import file
于 2010-12-08T02:12:13.097 に答える
1046

問題はありません:

from application.app.folder.file import func_name

folderも含まれていることを確認し__init__.pyてください。これにより、パッケージとして含めることができます。他の回答が について話している理由がわかりませんPYTHONPATH

于 2014-02-24T18:27:45.203 に答える
176

質問のように、モジュールが並列の場所にある場合:

application/app2/some_folder/some_file.py
application/app2/another_folder/another_file.py

この省略表現により、一方のモジュールが他方から見えるようになります。

import sys
sys.path.append('../')
于 2016-11-15T14:55:13.513 に答える
67

ドキュメントに記載されているように、アドホックな方法は環境変数を使用するPYTHONPATHことだと思います: Python2Python3

# Linux & OSX
export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH

# Windows
set PYTHONPATH=C:\path\to\dirWithScripts\;%PYTHONPATH%
于 2014-02-19T11:00:06.333 に答える
37

Python の相対インポートを試してください:

from ...app.folder.file import func_name

先頭のすべてのドットは、現在のディレクトリから始まる階層内の別の上位レベルです。


問題?これがうまくいかない場合は、おそらく多くの落とし穴の相対インポートが持っていることに少し慣れています。詳細については、回答とコメントを参照してください

ヒント:__init__.pyすべてのディレクトリ レベルで使用します。最上位ディレクトリから実行するか、PYTHONPATH にその最上位ディレクトリを含める必要がある場合がありますpython -m application.app2.some_folder.some_file(.py は省略します)。ふぅ!

于 2017-12-17T08:43:45.267 に答える
28

Linux上のpython3で私のために働いた

import sys  
sys.path.append(pathToFolderContainingScripts)  
from scriptName import functionName #scriptName without .py extension  
于 2016-08-16T15:24:27.670 に答える
7

特定のパスからモジュールをロードする目的が、カスタム モジュールの開発中にユーザーを支援することである場合、カスタム モジュールのルートを指すテスト スクリプトの同じフォルダーにシンボリック リンクを作成できます。このモジュール参照は、そのフォルダーで実行されるスクリプトの同じ名前でインストールされている他のモジュールよりも優先されます。

これを Linux でテストしましたが、シンボリック リンクをサポートする最新の OS でも動作するはずです。

このアプローチの利点の 1 つは、独自のローカル SVC ブランチの作業コピーにあるモジュールを指定できることです。これにより、開発サイクル時間が大幅に簡素化され、モジュールのさまざまなバージョンを管理する際の失敗モードが削減されます。

于 2015-12-23T15:42:47.780 に答える
5

を実行する代わりに、次のimport ...ように実行します。

from <MySubFolder> import <MyFile>

MyFile は MySubFolder 内にあります。

于 2020-02-13T07:48:53.403 に答える
3

以下のコードは、パスで指定された Python スクリプトを、その場所に関係なく、Python バージョン セーフな方法でインポートします。

def import_module_by_path(path):
    name = os.path.splitext(os.path.basename(path))[0]
    if sys.version_info[0] == 2:   
        # Python 2
        import imp
        return imp.load_source(name, path)
    elif sys.version_info[:2] <= (3, 4):  
        # Python 3, version <= 3.4
        from importlib.machinery import SourceFileLoader
        return SourceFileLoader(name, path).load_module()
    else:                            
        # Python 3, after 3.4
        import importlib.util
        spec = importlib.util.spec_from_file_location(name, path)
        mod = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(mod)
        return mod

これは、psutilsのコードベースの1042 行目psutils.test.__init__.py( 09.10.2020 時点での最新のコミット) で見つかりました。

使用例:

script = "/home/username/Documents/some_script.py"
some_module = import_module_by_path(script)
print(some_module.foo())

重要な警告: モジュールはトップレベルとして扱われます。その中の親パッケージからの相対インポートは失敗します。

于 2020-09-10T09:31:36.033 に答える