我有一个文件common_file.py
,它包含主程序其他部分所需的函数。同时,common_file.py
从only_main_required.py
导入一些只在主程序运行时使用的数据。我的问题是,我有另一个程序helper_program.py
,它使用common_file.py
,但它与主文件不在同一目录中(程序开始的地方,或者换句话说是当前目录)。所以当我导入common_file.py
时,它试图导入only_main_required.py
,但由于当前目录不同,导入失败并返回ModuleNotFoundError
。
一个最小的可重复的例子:
我有这个项目结构(超级简化,但足以重现我的意思):
project1
├── 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可以找到它,但是当你从helper_program
导入only_main_required
时,它失败了,因为它不知道project1
或folder1
的存在。
我一直在寻找一段时间了,但我找到的所有解决方案都是针对不同的情况(例如,一个共享库,但这里不是这样,我不想要一个共享库,我只是想要一些来自一个模块的代码,当从一个特定的源运行时,这些代码碰巧导入“不可导入”的代码),虽然我有可能的解决方案,我仍然不确定选择哪一个(或者是否选择另一个我不知道的解决方案)。
例如,一种解决方案是将common_file.py
的导入 Package 在一个try-except块中,如果有ModuleNotFoundError
,我只需传递错误,因为我根本不需要那个模块。
另一种解决方案是在common_file.py
中使用sys.path
添加路径,但这是我最不喜欢的解决方案,因为它使我更难理解发生了什么(通过try-except和一些注解,当源代码是helper_program.py
而不是main_file.py
时,我处理的特定情况将足够清楚)
另一个解决方案是将helper_program
移动到project1
(根文件夹),但我也不喜欢这个解决方案,因为考虑到程序的整体结构,它根本没有任何意义(helper_program.py
是一个帮助处理与folder2
文件夹相关的内容的程序)。
此外,我需要导入在common_file.py
中,而不是在ifnameguard子句中,因为当主程序是导入common_file.py
的文件时,我需要它们,而不是当helper_program.py
是源代码时。
我很惊讶,我找不到任何类似我的情况。也许有另一种方法,在这些情况下通常是管理?
2条答案
按热度按时间5q4ezhmt1#
解决方案:将您的导入移动到函数中
更改这两个文件,并保持其他内容不变。
个字符
wfveoks02#
所以我想扩展一下我在@Ted Possible的回答中所做的评论。
对于我的用例来说,最好的方法是更改当前目录并将父目录添加到
sys.path
,如下所示:字符串
这样,只有
helper_program.py
需要修改(这对我的用例来说是有意义的,因为它只用于开发目的,也就是说,它不应该包含在发布版本中)。而且,这是有意义的,因为我有太多的导入(这是一个巨大的项目)和许多文件路径,所以如果我选择任何其他方法,我将不得不做太多的修改。