Python 在文件之间使用全局变量?
我对全局变量是如何工作的有点困惑。我有一个大项目,大约有50个文件,我需要为所有这些文件定义全局变量 我所做的是在我的projectsPython 在文件之间使用全局变量?,python,share,globals,Python,Share,Globals,我对全局变量是如何工作的有点困惑。我有一个大项目,大约有50个文件,我需要为所有这些文件定义全局变量 我所做的是在我的projectsmain.py文件中定义它们,如下所示: # ../myproject/main.py # Define global myList global myList myList = [] # Imports import subfile # Do something subfile.stuff() print(myList[0]) 我试图在子文件.py中使用
main.py
文件中定义它们,如下所示:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
我试图在子文件.py
中使用myList
,如下所示
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
我尝试了另一种方法,但也没有成功
# ../myproject/main.py
# Import globfile
import globfile
# Save myList into globfile
globfile.myList = []
# Import subfile
import subfile
# Do something
subfile.stuff()
print(globfile.myList[0])
在subfile.py
中,我有这样一个:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
但同样,它没有起作用。我应该如何实现这一点?我知道当两个文件彼此并不了解(子文件不知道main)时,它不能像这样工作,但我想不出如果不使用io写入或pickle(我不想这样做)如何工作。从您的\u文件导入中使用
*
应该可以解决您的问题。它定义了所有内容,以便全局可用(当然,导入中的局部变量除外)
例如:
##test.py:
from pytest import *
print hello_world
# ../myproject/main.py
# Define global myList
# global myList - there is no "global" declaration at module level. Just inside
# function and methods
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
# settings.py
def init(arg):
global myList
myList = []
mylist.append(arg)
# subfile.py
import settings
def print():
settings.myList[0]
# main.py
import settings
settings.init("1st") # global init before used in other imported modules
# Or else they will be undefined
import subfile
subfile.print() # global usage
以及:
您可以将Python全局变量视为“模块”变量,因此它们比C中的传统“全局变量”更有用 全局变量实际上是在模块的
\uuuu dict\uuu
中定义的,可以作为模块属性从模块外部访问
因此,在您的示例中:
##test.py:
from pytest import *
print hello_world
# ../myproject/main.py
# Define global myList
# global myList - there is no "global" declaration at module level. Just inside
# function and methods
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
# settings.py
def init(arg):
global myList
myList = []
mylist.append(arg)
# subfile.py
import settings
def print():
settings.myList[0]
# main.py
import settings
settings.init("1st") # global init before used in other imported modules
# Or else they will be undefined
import subfile
subfile.print() # global usage
以及:
您的第二次尝试将非常有效,并且实际上是处理您希望全局可用的变量名的一种非常好的方法。但最后一行有一个名称错误。以下是它应该是什么样子:
# ../myproject/main.py
# Import globfile
import globfile
# Save myList into globfile
globfile.myList = []
# Import subfile
import subfile
# Do something
subfile.stuff()
print(globfile.myList[0])
看到最后一行了吗?myList是globfile的属性,而不是子文件。这将按照您的要求工作
Mike问题是您从
main.py
定义了myList
,但是subfile.py
需要使用它。这里有一个干净的方法来解决这个问题:将所有全局变量移动到一个文件中,我称这个文件为settings.py
。此文件负责定义全局变量并初始化它们:
# settings.py
def init():
global myList
myList = []
接下来,您的子文件可以导入全局文件:
# subfile.py
import settings
def stuff():
settings.myList.append('hey')
请注意,subfile
不调用init()
-该任务属于main.py
:
# main.py
import settings
import subfile
settings.init() # Call only once
subfile.stuff() # Do stuff with global var
print settings.myList[0] # Check the result
通过这种方式,您可以在实现目标的同时避免多次初始化全局变量。Hai Vu答案非常有效,只需一句评论:
如果您在其他模块中使用全局变量,并且希望动态设置全局变量,请注意在设置全局变量后导入其他模块,例如:
##test.py:
from pytest import *
print hello_world
# ../myproject/main.py
# Define global myList
# global myList - there is no "global" declaration at module level. Just inside
# function and methods
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
# settings.py
def init(arg):
global myList
myList = []
mylist.append(arg)
# subfile.py
import settings
def print():
settings.myList[0]
# main.py
import settings
settings.init("1st") # global init before used in other imported modules
# Or else they will be undefined
import subfile
subfile.print() # global usage
请参阅Python的文档:
在单个程序中跨模块共享信息的规范方法是创建一个特殊模块(通常称为config或cfg)
config.py:
在应用程序的所有模块中导入配置模块;然后,该模块将成为可用的全局名称
main.py:
或
通常,不要使用modulename import*中的。这样做会使导入器的名称空间变得混乱,并使linter更难检测未定义的名称
我刚刚看到这篇文章,想发布我的解决方案,以防有人和我处于相同的情况,在开发的程序中有相当多的文件,而你没有时间仔细考虑模块的整个导入顺序(如果你没有像我一样从一开始就正确地考虑)
在这种情况下,在您启动全局的脚本中,只需编写一个类,该类如下所示:
class My_Globals:
def __init__(self):
self.global1 = "initial_value_1"
self.global2 = "initial_value_2"
...
然后使用,而不是脚本中启动全局变量的行,而不是
global1 = "initial_value_1"
使用
然后,我可以通过
globals.desired_global
在任何脚本中,这些更改也会自动应用于使用它们的所有其他脚本。由于本文/讨论中提到的问题,所有的导入语句都使用了之前失败的导入语句,现在一切都正常了。与全局变量的简单导入相比,我只是认为全局对象的属性是动态变化的,而不需要考虑/更改任何导入逻辑,而这无疑是解决此类问题的最快和最简单的方法(供以后访问)。实际上,你的第二种方法对我很有效。main.py正确打印出“嘿”。你能通过“它不起作用”更具体地说明你告诉我的吗?@rodion:importing cycles-子文件中的代码尝试导入globfile,它的主体将自己导入回NameError:name“myList”未定义frommain.py
lineprint(globfile.myList[0])
我的理解是,\uuuu init\uuuu.py
也可以用来定义全局变量,这种用法过时了吗?是否应该首选config.py
文件方法?除非您指定了一个这样的变量,否则我个人会不惜一切代价避免使用import*
,以便引用是明确的(并且不会混淆),此外,您在任何模块中实际使用过所有“*
”引用吗?不要进行导入*。您的全局变量将不再保持同步。每个模块都接收自己的副本。更改一个文件中的变量不会反映在另一个文件中。我喜欢一般的方法,但不喜欢整个init()。模块只在第一次导入时才被评估,所以在模块主体中初始化这些变量是完全可以的。+1柯克:我同意。但是,我的方法防止了其他模块在主程序启动之前修改globals.myList的情况。您应该将其称为globals以外的名称,这是一个内置名称。PyLint给出警告:“重新定义内置的‘globals’(重新定义的内置)”谢谢。您知道如何通过使用此文件结构(即从settin导入全局变量)删除Eclipse PyDev中出现的“Undefined variable from import”错误吗