部分导入:导入所有内容

2024-10-01 02:36:08 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以执行一个非原子的python导入

例如,我有一个文件如下:

# Filename: a.py
myvariable = 1
mylist = [1, 2, 3]
raise ImportError
donotimportthis = 5

然后我有一个单独的文件,它执行以下操作:

import a
a.myvariable == 1 # This is okay as it imported it
a.donotimportthis # <-- raise an exception as this is not imported.

我有一个包含一些python代码的文件,其格式如下:

...variables...
import X

我没有安装X,也不需要它,但是我需要变量。 注意:此文件不是由我自动生成的,而是由版本已冻结的工具自动生成的


Tags: 文件方法pyimportisasitfilename
3条回答

两种选择,按偏好降序排列:

  1. 更改自动生成过程。不是调用proprietary_autogen_process,而是调用custom_autogen_wrapper。这个包装器首先调用专有的第三方工具,然后通过搜索导入模块X的代码来修改生成的模块源代码,并删除它之后的所有内容

    这是相对简单的。您只需要注意不要通过执行太松散(或太严格)的导入代码匹配来引入误报或漏报。理想情况下,你会使用AST rewriter,但这可能是过度杀伤力;对import X的正则表达式搜索可能会起作用,但如果此文本出现在注释、字符串文本或未执行的方法中,则会产生错误的结果

  2. 在导入自动生成模块时自动生成模块将在其中找到的位置生成存根模块X。我不建议这样做,因为它很乏味:您可能不能只生成一个空模块,因为自动生成的模块将要使用X。您需要生成有意义的方法存根

您可以使用

from a import myvariable

编辑:如果文件中任何扁平的内容出现错误,上述操作将不起作用。如果你没有办法编辑导入的文件,那么我不知道是否有一个(合理的)解决方案。抱歉,我没意识到。 (一个不合理的解决方案是将文件作为文本读入,切片,然后对其运行eval)

或者,正如评论中提到的,把你不想要的东西放在下面

if __name__=="__main__":
    <here>

只有直接运行文件时才会调用它

您可以做的是删除模块末尾的donotimportthis变量,如下所示:del donotimportthis。希望对你有帮助

相关问题 更多 >