python - 從不同文件夾導入文件


我有以下文件夾結構。

application/app/folder/file.py

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

application/app2/some_folder/some_file.py

我試過了

from application.app.folder.file import func_name

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


Answers



默認情況下,你不能。 當導入一個文件時,Python只搜索當前目錄,運行入口腳本的目錄以及包含安裝目錄的sys.path (實際上它比這更複雜一點,但是這包括在大多數情況下)。

但是,您可以在運行時添加到Python路徑中:

# some_file.py
import sys
sys.path.insert(0, '/path/to/application/app/folder')

import file



沒有錯:

from application.app.folder.file import func_name

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




當模塊位於並行位置時,如問題:

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

這個簡寫使得一個模塊對另一個模塊可見:

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



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

PYTHONPATH

如文檔中所述: Python2Python3

export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH



據我所知,直接在要導入的函數的文件夾中添加一個__init__.py文件可以完成這個工作。




在linux上為python3工作

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



考慮將application作為您的python項目的根目錄,在applicationappfolderfolder夾中創建一個空的__init__.py文件。 然後在你的some_file.py進行如下修改,以獲得func_name的定義:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()



這在Windows上適用於我

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

import some_file



如果從特定路徑加載模塊的目的是為了在開發自定義模塊期間提供幫助,則可以在測試腳本的同一個文件夾中創建一個指向自定義模塊根目錄的符號鏈接。 此模塊引用將優先於為該文件夾中運行的任何腳本安裝的任何其他相同名稱的模塊。

我在Linux上測試過,但它應該支持符號鏈接的任何現代操作系統。

這種方法的一個優點是,你可以指向一個坐在你自己的本地SVC分支工作副本的模塊,這可以大大簡化開發週期時間並減少管理不同版本模塊的失敗模式。




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

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

from application.app.folder.file import func_name

對此:

from .application.app.folder.file import func_name

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

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




我很特別:我使用Python與Python!

我只是完成信息:對於Windows和Linux,相對路徑和絕對路徑都工作到sys.path (我需要相對路徑,因為我在幾個PC上和不同的主目錄下使用我的腳本)。

而當使用Windows時, \/可以用作文件名的分隔符,當然,您必須將\轉換成Python字符串,
一些有效的例子:

sys.path.append('c:\\tools\\mydir')
sys.path.append('..\\mytools')
sys.path.append('c:/tools/mydir')
sys.path.append('../mytools')

(注意:我認為/\更方便,如果它比'Windows原生'更為方便,因為它與Linux兼容並且更容易寫入和復製到Windows資源管理器)




將應用程序移至其他環境時,將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文檔。




你可以按f5刷新Python shell,或者進入Run-> Run Module。 這樣你就不必改變目錄來從文件中讀取一些東西。 Python會自動改變目錄。 但是如果你想在Python Shell中使用不同目錄中的不同文件,那麼你可以在sys中更改目錄, 就像Cameron之前說的那樣。




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