[Python] 從不同文件夾導入文件


Answers

沒有錯:

from application.app.folder.file import func_name

只要確保文件夾還包含一個__init__.py ,這允許它被包含在一個包中。 不知道為什麼其他答案談論PYTHONPATH。

Question

我有以下文件夾結構。

application/app/folder/file.py

我想從駐留在另一個Python文件中的file.py導入一些函數

application/app2/some_folder/some_file.py

我試過了

from application.app.folder.file import func_name

和其他一些嘗試,但迄今為止我無法正常導入。 我怎樣才能做到這一點?




由於你的問題看起來像* nix特定的,我認為一個乾淨的方法是使用環境變量

PYTHONPATH

如文檔中所述: Python2Python3

export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH



在linux上為python3工作

import sys  
sys.path.append(pathToFolderContainingScripts)  
from scriptName import functionName #scriptName without .py extension  



這在Windows上適用於我

# some_file.py on mainApp/app2 
import sys
sys.path.insert(0, sys.path[0]+'\\app2')

import some_file



你的問題是,Python正在尋找這個文件的Python目錄,而不是找到它。 你必須指定你正在談論你所在的目錄,而不是Python目錄。

要做到這一點你改變這一點:

from application.app.folder.file import func_name

對此:

from .application.app.folder.file import func_name

通過添加點你說在這個文件夾中查找應用程序文件夾,而不是在Python目錄中查找。

(希望這能解決你的問題!)




將應用程序移至其他環境時,將sys.path.append與絕對路徑配合使用並不理想。 使用相對路徑並不總是工作,因為當前工作目錄取決於腳本如何運行。

由於應用程序文件夾結構是固定的,我們可以使用os.path來獲取完整的路徑。 例如,如果這是結構:

/home/me/application/app2/some_folder/vanilla.py
/home/me/application/app2/another_folder/mango.py

假設你想導入“芒果”模塊。 您可以在vanilla.py中執行以下操作:

import sys, os.path
mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+ '/another_folder/')
sys.path.append(mango_dir)
import mango

當然,你不需要mango_dir變量。

要理解這個工作如何看待這個交互式會話的例子:

>>> import os
>>> mydir = '/home/me/application/app2/some_folder'
>>> newdir = os.path.abspath(os.path.join(mydir, '..'))
>>> newdir
    '/home/me/application/app2'
>>> newdir = os.path.abspath(os.path.join(mydir, '..')) + '/another_folder'
>>> 
>>> newdir
'/home/me/application/app2/another_folder'
>>> 

並檢查os.path文檔。




sys.path.insert(0, '/path/to/application/app/folder')