[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

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




我很特別:我在Windows上使用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資源管理器)




考慮將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()



在我的情況下,我有一個課程導入。 我的文件是這樣的:

# /opt/path/to/code/log_helper.py
class LogHelper:
    # stuff here

在我的主文件中,我通過以下代碼包含代碼:

path.append("/opt/path/to/code/")
from log_helper import LogHelper



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




這適用於我在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目錄。




我認為一個簡單的方法是使用文檔中描述的環境變量PYTHONPATHPython2Python3

export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH
# Windows users: use "set" instead of "export"



Links