Как использовать внешние переменные в 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
Как использовать внешние переменные в 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
Просто переустановите переменную в модуле:
import myfunc
from myfunc import print_a
a = 10
print a
myfunc.a = a
print_a()
В противном случае это невозможно.
Помните, что python обрабатывает модули таким образом, который отличается от C.
import в python не "копирует содержимое" файла в этом месте,
но он выполняет код в данном файле и создает объект module.
Глобальная переменная модуля - это атрибуты объекта module, которые могут быть изменены, как я показал. Не существует такого понятия, как "глобальная переменная", кроме встроенных.
Я бы предложил реорганизовать ваш код таким образом, что вам вообще не нужно изменять эту глобальную переменную, перемещая код, который использует myfunc.a от main1 до myfunc.
Тот факт, что вам нужна такая глобальная переменная, уже является запахом кода, что что-то не так с вашим кодом, и вы должны попытаться его исправить.
На самом деле есть способ повлиять на "глобальный масштаб", но он настолько хакерский, что я даже не хочу упоминать об этом. Поверьте мне: вы не хотите его использовать. Если люди видят ваш код с помощью такого взлома, вы можете быть в опасности.
В отличие от 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) рекомендуется Переместить переменную (переменные) в другой модуль и импортировать ее как myfunc, так и main1.
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
Это обходной путь для этой проблемы с использованием общего внешнего файла. В этом примере я сохраняю переменную индекса, чтобы пометить в каждом приложении доступ к файлу. Переменная indxOpen в ext1.py и indxO в ext2.py обновляются и сохраняются в общем внешнем текстовом файле "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)