Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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_Share_Globals - Fatal编程技术网

Python 在文件之间使用全局变量?

Python 在文件之间使用全局变量?,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中使用

我对全局变量是如何工作的有点困惑。我有一个大项目,大约有50个文件,我需要为所有这些文件定义全局变量

我所做的是在我的projects
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”未定义
from
main.py
line
print(globfile.myList[0])
我的理解是,
\uuuu init\uuuu.py
也可以用来定义全局变量,这种用法过时了吗?是否应该首选
config.py
文件方法?除非您指定了一个这样的变量,否则我个人会不惜一切代价避免使用
import*
,以便引用是明确的(并且不会混淆),此外,您在任何模块中实际使用过所有“
*
”引用吗?不要进行导入*。您的全局变量将不再保持同步。每个模块都接收自己的副本。更改一个文件中的变量不会反映在另一个文件中。我喜欢一般的方法,但不喜欢整个
init()。模块只在第一次导入时才被评估,所以在模块主体中初始化这些变量是完全可以的。+1柯克:我同意。但是,我的方法防止了其他模块在主程序启动之前修改globals.myList的情况。您应该将其称为globals以外的名称,这是一个内置名称。PyLint给出警告:“重新定义内置的‘globals’(重新定义的内置)”谢谢。您知道如何通过使用此文件结构(即从settin导入全局变量)删除Eclipse PyDev中出现的“Undefined variable from import”错误吗