我在Python 2.7中使用可怕的exec open
,从我的主脚本(file1.py
)中执行另外两个Python文件(file2.py
和main_file.py
)。 / p>
我是一名新手程序员,我这样做是因为外部文件位于驱动器上的其他位置。 main_file.py
旁边的许多不同Python脚本都可以访问file1.py
和file2.py
中的内容。因此,当我更新这两个脚本时,访问它们的所有脚本都将从更新中受益。它们包含适用于我所有Python脚本的列表和通用规则。
在我向newFunction()
引入新功能main_file.py
之前,一切正常。从名为newFunction()
的主脚本的另一个函数内部调用topFunction()
。
exec open(file2.py).read()
SyntaxError:函数
'topFunction()'
中不允许使用非限定exec,因为它包含带有自由变量的嵌套函数。
错误消息实际上指向下面的第2步:
topFunction()
首先致电newFunction()
topFunction()
希望exec open(file2.py)
为了使事情进一步复杂化,newFunction()
访问先前已执行到file1.py
的 main_file.py
的列表变量。此外,file2.py
一旦从main_file.py
执行,file1.py
也会引用这些列表。
所以,我找到了至少可以让脚本运行的东西,没有错误信息。
exec open(file2.py).read() in globals(), locals()
此实际上执行file2.py
中的代码,然后继续运行剩下的内容以在main_file.py
中运行。
但问题是file2.py
不 能够操纵main_file.py
中原生的变量(对象)。
我无法file2.py
设置myString = "pancakes"
,然后将main_file.py
设为print myString
。
在介绍newFunction()
之前,我只能使用exec open(file2.py).read()
。
是否有办法解决这样的问题,以便外部执行的脚本也能影响主脚本中使用的变量?
exec open(file2.py).read() in globals(), locals()
答案 0 :(得分:2)
引用docs:
此函数类似于exec语句,但解析文件 而不是一个字符串。它与import语句不同 它不使用模块管理 - 它读取文件 无条件地并且不创建新模块。 [1]
参数是文件名和两个可选字典。文件 被解析并评估为一系列Python语句(类似地 使用全局和本地字典作为全局和 本地命名空间如果提供,则locals可以是任何映射对象。 请记住,在模块级别,全局变量和局部变量是相同的 字典。如果两个单独的对象作为全局和本地传递, 代码将被执行,就像它嵌入在类中一样 定义
所以你应该试试这个:
execfile('file1.py')
execfile('file2.py')