我有一个文件common_file.py
,其中包含其他主程序部分所需的函数。同时,common_file.py
从only_main_required.py
导入一些仅在主程序运行时使用的数据。我的问题是,我还有一个程序helper_program.py
,它使用common_file.py
,但它并不位于与主文件(程序启动位置或当前目录)相同的目录中。因此,当我尝试导入common_file.py
时,它会尝试导入only_main_required.py
,但由于当前目录不同,导致import失败并出现ModuleNotFoundError
。
为了简化问题,以下是一个最小可重现示例:
project1
├── folder1
│ │
│ ├── only_main_required.py
│
└── folder2
├── common_file.py
└── helper_program.py
└── main_file.py (主程序的起源)
# 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可以找到它。但是,当从helper_program
导入only_main_required
时,就会失败,因为它不知道project1
或folder1
的存在。
针对这个问题,我考虑了几个解决方案:
在common_file.py
中的import语句周围添加一个try-except块,在遇到ModuleNotFoundError
时忽略错误,因为我在这个场景下并不需要那个模块。
在common_file.py
中使用sys.path
添加路径,但这并不是我最喜欢的解决方案,因为它使得代码逻辑难以理解。相比之下,try-except结合注释能更清晰地表明是在处理特定来源为helper_program.py
而不是main_file.py
的情况。
将helper_program.py
移动到project1
(根目录),但我不喜欢这个方案,因为它不符合整个程序结构的逻辑(helper_program.py
是一个帮助处理与folder2
文件夹相关事务的程序)。
另外,我还不能将这些import语句放在common_file.py
中的if name == "main"保护性代码块中,因为在主程序作为导入方时确实需要这些导入。
对于这种情况,我感到惊讶的是未能找到类似情况的现成解决方案。或许存在其他管理这类场景的标准方法?