12

如何在 Python 中使用外部变量,就像extern int x;在 C 中一样?

例如,

main1.py:

from myfunc import print_a 

a = 10 
print a    
print_a()

myfunc.py:

def print_a():
    global a   
    print a
4

3 回答 3

11

只需重新分配模块中的变量:

import myfunc
from myfunc import print_a 

a = 10 

print a

myfunc.a = a

print_a()

否则是不可能的。

请记住,python 处理模块的方式与 C 完全不同。importin python 不会那个地方“复制文件的内容”,而是执行给定文件中的代码并创建一个module对象。

模块的全局变量是module对象属性,可以像我展示的那样进行修改。除了内置函数外,没有“全局变量”这样的概念。


我建议重构你的代码,这样你就不必修改这个全局变量,将使用myfunc.afrom的代码移动main1myfunc。您需要这样的全局变量这一事实已经是一种代码味道,表明您的代码有问题,您应该尝试修复它。


实际上有一种方法可以影响“全球范围”,但它太骇人听闻了,我什至不想提及它。相信我:你不想使用它。如果人们看到您的代码使用这种黑客攻击,您可能会处于人身危险之中。

于 2013-08-03T15:56:18.860 回答
3

与 C 不同,在全局范围内声明的变量的范围仍仅限于创建它们的模块,因此您需要a使用它所在的模块来限定名称。

global当您要通过重新分配修改全局变量时使用该关键字,当您只是引用全局变量时不需要它。

如果您尝试访问另一个文件的变量,则必须导入该模块,并且由于文件的结构方式,您有几种解决问题的方法:

选项1)移动myfunc.print_a函数内部和import main1内部的引用myfunc以查看a

main1.py

import myfunc

a = 10 

def main():
    print a    
    myfunc.print_a()

if __name__ == '__main__':
    main()

myfunc.py

import main1

def print_a():
    print main1.a

选项 2)建议将变量移动到另一个模块中并同时拥有myfuncmain1导入它。

vals.py

a = 20

main1.py

import vals
from myfunc import print_a

vals.a = 10 

print vals.a    
print_a()

myfunc.py

import vals

def print_a():
    print vals.a
于 2013-08-03T16:28:54.673 回答
-1

这是通过使用通用外部文件解决此问题的方法。在此示例中,我存储了一个索引变量以在每个应用程序中标记是否正在访问文件。ext1.py 中的变量 indxOpen 和 ext2.py 中的 indxO 正在更新并存储在一个通用的外部文本文件“externalVars.txt”中

引导应用程序 ext1.py

# lead application ext1.py 
 #this alternately flips the value of indxOpen on prime number intervals 
 import time

 def update(d,v1):
      f=open(d+'externalVars.txt','r+')
      f.write(str( v1)) 
      f.truncate()
      f.close()

 # ensure variable is initialised and made available to external apps
 indxOpen = False
 var_dir = "<your external var directory>/"
 try:
      f =open(var_dir+'externalVars.txt','r')
 except:
      f= open(var_dir+'externalVars.txt','w')
      f.close()
 # this alternately flips the value of indxOpen on prime number intervals    
 update(var_dir,indxOpen)
 i = 0
 while True:   
      while indxOpen:
      i += 1
      if (i % 13) ==0:
        indxOpen = indxOpen ^ True
        update(var_dir,indxOpen)
       f=open(var_dir+'externalVars.txt','r+')
       t=f.readline()
       print "app1",t," ",i
       if t=='False':
           print "app1 updated"
           update(var_dir,indxOpen)
           indxOpen = False  
        else:
            time.sleep(1.4)

   while not indxOpen:
       f=open(var_dir+"externalVars.txt","r+")
       t=f.readline()
       print "app1",t
       if t=='True':           
           indxOpen = True          
       else:
           time.sleep(1)

ext2.py 以下应用程序

#   ext2.py this alternately flips the value of indxO on prime number intervals but it is         initialised by the lead application
# in this case ext1.py
# python 2.7.12
import time

def update(d,v1):
    f=open(d+'externalVars.txt','r+')
    f.write(str( v1))
    f.truncate()
    f.close()

var_dir = "<your external var directory>/"

# intialise external variable
f=open(var_dir+'externalVars.txt','r+')
t=f.readline()
if t=='True':
    indxO= True
if t=='False':
    indxO= False
i=0
while True:

    while indxO:    
        f=open(var_dir+"externalVars.txt","r+")
        t=f.readline()
        print "app2",t
        if t=='False':
            indxO = False       
            update(var_dir,indxO)
        else:
            time.sleep(1.5)


    while not indxO:
        i += 1
        if (i % 17) ==0:
            indxO = indxO ^ True
            update(var_dir,indxO)
        f=open(var_dir+"externalVars.txt","r+")
        t=f.readline()
        print "app2",t," ",i
        if t=='True':
            indxO = True
            print "apt2 updated"
            update(var_dir,indxO)
        else:
            time.sleep(1.3)
于 2019-05-17T17:15:57.397 回答