仅在某些程序中需要时如何处理导入文件中的导入

问题描述 投票:0回答:1

我有一个文件

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
是源时。

令我惊讶的是我找不到任何与我的情况类似的东西。也许还有另一种方法可以通常处理这些情况?

python python-3.x python-import
1个回答
0
投票

解决方案:将导入移至函数中

#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)

© www.soinside.com 2019 - 2024. All rights reserved.