Python:“在globals(),locals()中执行open(external.py).read()”,同时允许它操作主脚本

时间:2016-06-10 14:47:38

标签: python python-2.7 exec

背景

我在Python 2.7中使用可怕的exec open,从我的主脚本(file1.py)中执行另外两个Python文件(file2.pymain_file.py)。 / p>

我是一名新手程序员,我这样做是因为外部文件位于驱动器上的其他位置。 main_file.py旁边的许多不同Python脚本都可以访问file1.pyfile2.py中的内容。因此,当我更新这两个脚本时,访问它们的所有脚本都将从更新中受益。它们包含适用于我所有Python脚本的列表和通用规则。

在我向newFunction()引入新功能main_file.py之前,一切正常。从名为newFunction()的主脚本的另一个函数内部调用topFunction()

错误

  

exec open(file2.py).read()

     

SyntaxError:函数'topFunction()'中不允许使用非限定exec,因为它包含带有自由变量的嵌套函数。

错误消息实际上指向下面的第2步:

  1. topFunction()首先致电newFunction()
  2. topFunction()希望exec open(file2.py)
  3. 为了使事情进一步复杂化,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()
    

1 个答案:

答案 0 :(得分:2)

引用docs

  

此函数类似于exec语句,但解析文件   而不是一个字符串。它与import语句不同   它不使用模块管理 - 它读取文件   无条件地并且不创建新模块。 [1]

     

参数是文件名和两个可选字典。文件   被解析并评估为一系列Python语句(类似地   使用全局和本地字典作为全局和   本地命名空间如果提供,则locals可以是任何映射对象。   请记住,在模块级别,全局变量和局部变量是相同的   字典。如果两个单独的对象作为全局和本地传递,   代码将被执行,就像它嵌入在类中一样   定义

所以你应该试试这个:

execfile('file1.py')
execfile('file2.py')