英文:
Include Functions from File Relative Path (Python 3.10)
问题
I'm attempting to include & call Python functions from a different py
file, by providing a relative file path to the os.path.join
function call.
Let's say I have two py
files, TEST1.py
and TEST2.py
, and a function defined inside of TEST2.py
called TEST3()
.
Alongside the following directory structure:
TEST1.py
|____________TEST2.py
So TEST1.py
is located one directory above TEST2.py
.
With the following code inside of TEST1.py
:
import os
CurrDirPath = os.path.dirname(__file__)
CurrFileName = os.path.join(CurrDirPath, "../TEST2.py")
import TEST2
if (__name__ == '__main__'):
print(TEST2.TEST3())
And the following code inside of TEST2.py
:
def TEST3():
return "test"
Results in the following exception upon attempting to run TEST1.py
:
import TEST2
ModuleNotFoundError: No module named 'TEST2'
What is the proper way to include Python functions from a relative file path?
Thanks for reading my post, any guidance is appreciated.
英文:
I'm attempting to include & call Python functions from a different py
file, by providing a relative file path to the os.path.join
function call.
Let's say I have two py
files, TEST1.py
and TEST2.py
, and a function defined inside of TEST2.py
called TEST3()
.
Alongside the following directory structure:
TEST1.py
|____________TEST2.py
So TEST1.py
is located one directory above TEST2.py
.
With the following code inside of TEST1.py
:
import os
CurrDirPath = os.path.dirname(__file__)
CurrFileName = os.path.join(CurrDirPath, "../TEST2.py")
import TEST2
if (__name__ == '__main__'):
print(TEST2.TEST3())
And the following code inside of TEST2.py
:
def TEST3():
return "test"
Results in the following exception upon attempting to run TEST1.py
:
import TEST2
ModuleNotFoundError: No module named 'TEST2'
What is the proper way to include Python functions from a relative file path?
Thanks for reading my post, any guidance is appreciated.
答案1
得分: 1
以下是您要翻译的代码部分:
如果您的文件排列如下:
│ test1.py
│
└──── sub_folder
│ test2.py
以下代码应该可以工作:
import os
import sys
CurrDirPath = os.getcwd()
DesiredDirPath = CurrDirPath + os.sep + "sub_folder"
sys.path.insert(1, DesiredDirPath)
import TEST2
if (__name__ == '__main__'):
print(TEST2.TEST3())
但是,如果您的文件排列如下:
│ test2.py
│
└──── sub_folder
│ test1.py
以下代码应该可以工作:
import os
import sys
CurrDirPath = os.getcwd()
# 以下命令会返回上一级目录
DesiredDirPath = os.path.normpath(CurrDirPath + os.sep + os.pardir)
sys.path.insert(1, DesiredDirPath)
import TEST2
if (__name__ == '__main__'):
print(TEST2.TEST3())
首先,您需要获取所需的工作目录,然后通过以下代码在运行时将此路径添加到系统的已知路径中:
sys.path.insert(1, DesiredDirPath)
现在您可以导入TEST2。
在下面的链接中有相关讨论:
https://stackoverflow.com/questions/4383571/importing-files-from-different-folder
英文:
if your files arranged like this:
│ test1.py
│
└──── sub_folder
│ test2.py
Below Code should work:
import os
import sys
CurrDirPath = os.getcwd()
DesiredDirPath = CurrDirPath + os.sep + "sub_folder"
sys.path.insert(1, DesiredDirPath)
import TEST2
if (__name__ == '__main__'):
print(TEST2.TEST3())
But, if your files arranged like this:
│ test2.py
│
└──── sub_folder
│ test1.py
Below Code should work:
import os
import sys
CurrDirPath = os.getcwd()
# Below command, goes one folder back
DesiredDirPath = os.path.normpath(CurrDirPath + os.sep + os.pardir)
sys.path.insert(1, DesiredDirPath)
import TEST2
if (__name__ == '__main__'):
print(TEST2.TEST3())
first you need to get Desired working directory and Then you need to add this path to known paths of the system, clearly at runtime, by this code:
sys.path.insert(1, DesiredDirPath)
Now you can import TEST2
There is nice discussion at below link:
https://stackoverflow.com/questions/4383571/importing-files-from-different-folder
答案2
得分: 0
你可以使用 importlib。
如果 test2.py
位于子文件夹中,例如:
│ test1.py
│
└──── sub_folder
│ test2.py
那么对于 test1.py
:
import os
import importlib.util
import sys
CurrDirPath = os.path.dirname(__file__)
CurrFileName = os.path.join(CurrDirPath, r"sub_folder\test2.py")
spec = importlib.util.spec_from_file_location("test2", CurrFileName)
test2 = importlib.util.module_from_spec(spec)
sys.modules["module.name"] = test2
spec.loader.exec_module(test2)
if __name__ == '__main__':
print(test2.test3())
在 test2.py
中:
def test3():
return 'test2'
更多详细信息,请参阅答案:https://stackoverflow.com/questions/67631/how-can-i-import-a-module-dynamically-given-the-full-path
英文:
You can use importlib
If test2.py
in located in subfolder, for example:
│ test1.py
│
└──── sub_folder
│ test2.py
So for test1.py
:
import os
import importlib.util
import sys
CurrDirPath = os.path.dirname(__file__)
CurrFileName = os.path.join(CurrDirPath, r"sub_folder\test2.py")
spec = importlib.util.spec_from_file_location("test2", CurrFileName)
test2 = importlib.util.module_from_spec(spec)
sys.modules["module.name"] = test2
spec.loader.exec_module(test2)
if __name__ == '__main__':
print(test2.test3())
In test2.py
:
def test3():
return 'test2'
More details in answer https://stackoverflow.com/questions/67631/how-can-i-import-a-module-dynamically-given-the-full-path
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论