iT邦幫忙

0

Python 不同目录中的文件进行模块调用

  • 分享至 

  • xImage

目录结构:

TestProject
    ModuleFiles
        __init__.py
        Module1.py
    Profile
        __init__.py
        main.py
    test.py

在 main.py 文件中调用 Module1

from ModuleFiles import Module1

提示

ModuleNotFoundError: No module named 'ModuleFiles'

在 test.py 中使用相同的方式调用,可以正常调用,请问这个是怎么回事?

ccutmis iT邦高手 2 級 ‧ 2024-12-11 18:34:48 檢舉
試試
from ModuleFiles.Module1 import *
ccutmis iT邦高手 2 級 ‧ 2024-12-11 18:36:59 檢舉
如果是在 test.py 可試
from ModuleFiles.Module1 import *
-----
但在Profile目錄要去存取上層的ModuleFiles裡面的Module1 這個我沒試過
froce iT邦大師 1 級 ‧ 2024-12-11 22:54:43 檢舉
1. 用直接執行從 Profile.main要去調用ModuleFiles,沒做特殊處理是不可能的
當你執行(python Profile.main.py)時,python不會認為你的Profile是個package,你的專案資料夾不是TestProject,而是 TestProject/Profile了。 ModuleFiles和Profile被視為沒有任何關係。

2. 真的硬要的話
https://www.geeksforgeeks.org/python-import-module-from-different-directory/
簡單的說就是對sys.path下手,讓ModuleFiles被視為全域package

3. 但如果執行 test.py,你在 Profile.main 要 from ModuleFiles import Module1
這是可以的
對 test.py而言,這兩個package都是他的子package,所以可以互相存取。

總結:
python的import是對於被直接執行的.py檔案而言。被直譯器直接執行的檔案的所在資料夾是專案資料夾,同階層的目錄會被視為package,
.

1 個回答

0
ccutmis
iT邦高手 2 級 ‧ 2024-12-12 20:40:03
最佳解答

用絕對路徑載入模組的方法提供您參考看看... 假設 testProject 目錄路徑為: "C:\testProject"


Module1.py 內容 :

def hello_world():
    print(f"function : hello world!")

class ItHelp:
    def __init__ (self):
        self.uname="mis"
    def show_uname(self):
        print(f"class ItHelp : {self.uname}!")

main.py 內容 :

import sys
import importlib.util

def load_module_from_abs_path(module_name,abs_path):
    spec = importlib.util.spec_from_file_location(module_name, abs_path)
    foo = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = foo
    spec.loader.exec_module(foo)
    return foo

if __name__ == '__main__':
    x=load_module_from_abs_path("*","C:\\testProject\\ModuleFiles\\Module1.py")
    x.hello_world()
    y=x.ItHelp()
    y.show_uname()

執行結果 :

C:\testProject\Profile>main.py
function : hello world!
class ItHelp : mis!

我要發表回答

立即登入回答