Python 执行时跨程序同步变量
我试图创建一个基本模块,将Python 2.*中的Python 执行时跨程序同步变量,python,python-3.x,variables,Python,Python 3.x,Variables,我试图创建一个基本模块,将Python 2.*中的execfile函数添加到Python 3(使用函数execf(a))。该模块利用导入来运行.py文件,如下所示: import fibonacci # From a fibonacci.py file fibonacci.main() # Running the program x = 1 print(x) 我通过在多个实例中使用exec函数读取文件名并将其插入这些函数和字符串中来利用这一点 下面是模块(称为execfile)的外观:
execfile
函数添加到Python 3(使用函数execf(a)
)。该模块利用导入来运行.py文件,如下所示:
import fibonacci
# From a fibonacci.py file
fibonacci.main()
# Running the program
x = 1
print(x)
我通过在多个实例中使用exec
函数读取文件名并将其插入这些函数和字符串中来利用这一点
下面是模块(称为execfile
)的外观:
def execf(a):
try:
a.replace(".py", "") #removes '.py' from filename for use in exec functions
exec('import {}'.format(a)) #imports the specified file
exec('{}.main()'.format(a)) #runs the specified file
except AttributeError:
pass # Proceeds to rest of code after a sys.exit()
except ModuleNotFoundError:
pass # Proceeds to rest of code after program end
这是fibonacci.py的内容:
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
n = int(input("Enter number of terms:"))
print("Fibonacci sequence:")
for i in range(n):
print(fibonacci(i))
我想要做的是,来自fibonacci.py
的a
变量可以在main.py
文件中使用,这样我就可以打印它了,这应该可以用于脚本中的所有变量。是否有可能在main.py
的全局范围内修改全局变量或执行函数,以便在execf
-ing文件后在main.py
中使用变量
我想在评论中添加一些东西,可以扫描并检测需要添加到全局范围的变量。比如:
# fibonacci.py
...
#-;- variables: {"foo": bar, "baz": boo} -;-
# execfile.py
variables = scan_for_variables(script)
但我找不到任何关于如何让Python“查找”这些变量的信息。如果您有任何问题,请告诉我,谢谢 您所做的与
execfile
完全不同。因此,它不具有与execfile
相同的效果也就不足为奇了
(和exec
)直接在当前范围内执行一些代码execfile
检查模块是否已加载,如果未加载,则在全新的作用域中执行其代码,然后为您提供在当前作用域中保存该模块对象的变量import
mod.py
的文件,它如下所示:
import fibonacci
# From a fibonacci.py file
fibonacci.main()
# Running the program
x = 1
print(x)
现在,让我们导入它:
>>> import mod
1
>>> mod.x
1
>>> x
NameError: name 'x' is not defined
>>> import mod # nothing will get printed the second and later times
>>> execfile('mod.py')
1
>>> mod.x
NameError: name 'mod' is not defined
>>> x
1
>>> execfile('mod.py')
1
比较当您execfile
it时发生的情况:
>>> import mod
1
>>> mod.x
1
>>> x
NameError: name 'x' is not defined
>>> import mod # nothing will get printed the second and later times
>>> execfile('mod.py')
1
>>> mod.x
NameError: name 'mod' is not defined
>>> x
1
>>> execfile('mod.py')
1
除此之外,您的
execf
甚至无法工作,原因有多种:
- a、 replace(“.py”,”)不会变异
,它只返回一个您忽略的新字符串a
- 您的
模块没有名为fibonacci.py
的函数main
- 您不能“在系统退出后继续执行其余代码”,因为
退出程序。除了SystemExit:之外,您可以使用sys.exit
,你肯定不能用处理此问题,但您不应该这样做。无论如何,除了AttributeError:
处理它;这只会触发,例如,模块存在但没有
属性.main
无论如何,正如所解释的,在Python3中执行
execfile
的正确方法是打开该文件,读取其内容,然后exec
它们。换言之:
with open(a) as f:
exec(f.read())
如果要将其包装到函数中,请注意,它将在该函数的本地环境中执行代码。如果您想在globals中执行它,无论是在什么情况下,还是在其调用者的环境中,或者其他任何情况下,您都需要指定它。有关详细信息,请参见文档,但有一个简单的示例:
def execf(a):
with open(a) as f:
exec(f.read(), globals())
作为旁注,在极少数情况下,如果确实需要动态执行导入
,则不应执行导入
语句,应使用:
这毫无意义。您试图在导入的文件中执行main()
函数,但fibonacci.py
中不存在此类函数。然后您试图访问包含它的函数之外的局部变量a
,但它甚至不存在。@jasonharper在导入后运行fibonacci.main()
将运行fibonacci.py
文件。您在问题中提供了一个fibonacci.py
文件,而且它肯定没有main
功能。如果你给我们的代码与你的实际代码没有多大关系,这将使调试你的实际问题变得更加困难。有关更多信息,请参见“帮助”。您的代码中有许多明显的问题,首先是execfile
并没有做到您认为它可以做到的事情,但即使解决了所有这些问题,我确信您的代码中还有其他错误。其中一些问题可能并不存在于代码中,这只会让您对任何答案感到困惑。