我有一个文件
common_file.py
,其中包含主程序其他部分所需的功能。同时,common_file.py
从only_main_required.py
导入一些仅在主程序运行时使用的数据。我的问题是我有另一个程序 helper_program.py
它使用 common_file.py
但它不位于与主文件相同的目录中(程序启动的位置,或者换句话说,当前目录)。因此,当我导入 common_file.py
时,它会尝试导入 only_main_required.py
但由于当前目录不同,导入失败并显示 ModuleNotFoundError
。
一个最小的可重现示例:
我有这个项目结构(超级简化但足以重现我的意思):
项目1
├── folder1
│ │
│ ├── only_main_required.py
│
└── folder2
├ ├── common_file.py
├ └── helper_program.py
└main_file.py (origin of main program)
#only_main_required.py
random_var = False
#common_file.py
from folder1.only_main_required import random_var
#helper_program.py
import common_file
#main_file.py
from folder2 import common_file
所以当你在运行主程序时导入
only_main_required
时,没有问题,因为主程序源自 project1
文件夹,所以 folder1.only_main_required
有意义,Python 可以找到它,但是当你从 only_main_required
导入
helper_program
时,它失败,因为它不知道
project1
或 folder1
的存在。
我已经寻找了一段时间,但我找到的所有解决方案都是针对不同情况的(例如,共享库,但这里不是这种情况,我不想要共享库,我只想从特定源运行时碰巧导入“不可导入”代码的模块中的一些代码)虽然我有可能的解决方案,但我仍然不确定选择哪一个(或者是否选择我不知道的另一种解决方案) ).
例如,一种解决方案是将来自
common_file.py
的导入包装在 try- except 块中,如果存在 ModuleNotFoundError
,我只需传递错误,因为我根本不需要该模块。
另一个解决方案是在
sys.path
中使用 common_file.py
添加路径,但这是我最不喜欢的解决方案,因为它让我更难理解发生了什么(使用 try- except 和一些注释) ,很清楚,当来源是 helper_program.py
而不是 main_file.py
) 时,我正在处理特定情况
另一个解决方案是将
helper_program
移动到project1
(根文件夹),但我也不喜欢这个解决方案,因为考虑到程序的整体结构,它根本没有任何意义(helper_program.py
是一个帮助处理与 folder2
文件夹相关的内容的程序。
此外,我需要导入位于
common_file.py
中,而不是位于 if name 保护子句中,因为当主程序是导入 common_file.py
的文件时我需要它们,而不是当 helper_program.py
是源时。
令我惊讶的是我找不到任何与我的情况类似的东西。也许还有另一种方法可以通常处理这些情况?
解决方案:将导入移至函数中
#common_file.py
def get_rand_var():
from folder1.only_main_required import random_var
return random_var
#main_file.py
从文件夹2导入common_file rand_var = common_file.get_rand_var() 打印(rand_var)