python 如何处理导入文件中的导入,当它们只在某些程序中需要时

wtlkbnrh  于 6个月前  发布在  Python
关注(0)|答案(2)|浏览(74)

我有一个文件common_file.py,它包含主程序其他部分所需的函数。同时,common_file.pyonly_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时,它失败了,因为它不知道project1folder1的存在。
我一直在寻找一段时间了,但我找到的所有解决方案都是针对不同的情况(例如,一个共享库,但这里不是这样,我不想要一个共享库,我只是想要一些来自一个模块的代码,当从一个特定的源运行时,这些代码碰巧导入“不可导入”的代码),虽然我有可能的解决方案,我仍然不确定选择哪一个(或者是否选择另一个我不知道的解决方案)。
例如,一种解决方案是将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是源代码时。
我很惊讶,我找不到任何类似我的情况。也许有另一种方法,在这些情况下通常是管理?

5q4ezhmt

5q4ezhmt1#

解决方案:将您的导入移动到函数中
更改这两个文件,并保持其他内容不变。

#common_file.py

def get_rand_var():
    from folder1.only_main_required import random_var
    return random_var

个字符

wfveoks0

wfveoks02#

所以我想扩展一下我在@Ted Possible的回答中所做的评论。
对于我的用例来说,最好的方法是更改当前目录并将父目录添加到sys.path,如下所示:

#helper_program.py
import os
os.chdir("../")
import sys
currentdir = os.path.dirname(os.path.abspath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0, parentdir)
import common_file

字符串
这样,只有helper_program.py需要修改(这对我的用例来说是有意义的,因为它只用于开发目的,也就是说,它不应该包含在发布版本中)。而且,这是有意义的,因为我有太多的导入(这是一个巨大的项目)和许多文件路径,所以如果我选择任何其他方法,我将不得不做太多的修改。

相关问题