Как использовать внешние переменные в 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)