Как использовать внешние переменные в Python, такие как "extern int x;" в C?

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

Ответ 1

Просто переустановите переменную в модуле:

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. Тот факт, что вам нужна такая глобальная переменная, уже является запахом кода, что что-то не так с вашим кодом, и вы должны попытаться его исправить.


На самом деле есть способ повлиять на "глобальный масштаб", но он настолько хакерский, что я даже не хочу упоминать об этом. Поверьте мне: вы не хотите его использовать. Если люди видят ваш код с помощью такого взлома, вы можете быть в опасности.

Ответ 2

В отличие от 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

Ответ 3

Это обходной путь для этой проблемы с использованием общего внешнего файла. В этом примере я сохраняю переменную индекса, чтобы пометить в каждом приложении доступ к файлу. Переменная 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)