Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 执行时跨程序同步变量_Python_Python 3.x_Variables - Fatal编程技术网

Python 执行时跨程序同步变量

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)的外观:

我试图创建一个基本模块,将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
)的外观:

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
    的函数
  • 您不能“在系统退出后继续执行其余代码”,因为
    sys.exit
    退出程序。除了SystemExit:之外,您可以使用
    处理此问题,但您不应该这样做。无论如何,除了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
并没有做到您认为它可以做到的事情,但即使解决了所有这些问题,我确信您的代码中还有其他错误。其中一些问题可能并不存在于代码中,这只会让您对任何答案感到困惑。