Variable global de un archivo diferente Python

Así que tengo dos archivos diferentes como este:

file1.py

from file2 import * foo = "bar"; test = SomeClass(); 

file2.py

 class SomeClass : def __init__ (self): global foo; print foo; 

Sin embargo, parece que no consigo que el archivo 2 reconozca las variables del archivo 1, aunque ya se haya importado en el archivo 1. Sería extremadamente útil si esto fuera posible de alguna manera.

La importación de file1.py en file1.py hace que los nombres globales (es decir, a nivel de módulo) enlazados en file2 estén disponibles para el siguiente código en file1 ; el único nombre de este tipo es SomeClass . No hace lo contrario: los nombres definidos en file1 no están disponibles para codificar en file2 cuando file1 importa file2 . Este sería el caso incluso si importó de la manera correcta ( import file2 archivo import file2 , como @nate recomienda correctamente) en lugar de hacerlo de la manera horrible, horrible (si todo el mundo bajo el Sol olvidó la existencia del constructo) from ... import * , la vida sería mucho mejor para todos).

Aparentemente, desea que los nombres globales definidos en file1 estén disponibles para el código en file2 y viceversa. Esto se conoce como “dependencia cíclica” y es una idea terrible (en Python, o en cualquier otro lugar).

Así que, en lugar de mostrarte los increíblemente frágiles, a menudo inalcanzables hacks para lograr (algo parecido a) una dependencia cíclica en Python, preferiría discutir la excelente forma en que puedes evitar una estructura tan terrible.

Por ejemplo, podría poner nombres globales que deban estar disponibles para ambos módulos en un tercer módulo (por ejemplo, file3.py , para continuar su racha de nombres 😉 e importar ese tercer módulo en cada uno de los otros dos ( import file3 en ambos file1 y file2 , y luego use file3.foo , etc., es decir, nombres calificados , con el fin de acceder o configurar esos nombres globales desde uno o ambos de los otros módulos, no nombres de barras).

Por supuesto, se podría ofrecer más y más ayuda específica si aclarara (editando su Q) exactamente por qué cree que necesita una dependencia cíclica (solo una predicción fácil: no importa lo que le haga pensar que necesita una dependencia cíclica, usted es incorrecto;-).

Cuando escribes

 from file2 import * 

en realidad copia los nombres definidos en file2 en el espacio de nombres de file1 . Entonces, si reasigna esos nombres en el file1 , escriba

 foo = "bar" 

por ejemplo, solo hará ese cambio en el file1 , no en el file2 . Tenga en cuenta que si tuviera que cambiar un atributo de foo , digamos haciendo

 foo.blah = "bar" 

entonces ese cambio se reflejaría en el file2 , porque está modificando el objeto existente al que hace referencia el nombre foo , y no lo reemplaza por un nuevo objeto.

Puede obtener el efecto que desee haciendo esto en file1.py :

 import file2 file2.foo = "bar" test = SomeClass() 

(tenga en cuenta que debe eliminar from foo import * ) aunque sugeriría que piense detenidamente si realmente necesita hacer esto. No es muy común que se justifique realmente cambiar las variables de un módulo desde otro módulo.

from file2 import * está haciendo copias. Quieres hacer esto:

 import file2 print file2.foo print file2.SomeClass() 

global es un nombre poco module_namespace en Python, module_namespace sería más descriptivo.

El nombre completo de foo es file1.foo y la statement global se file1.foo ya que generalmente hay mejores formas de lograr lo que quieres hacer. (No puedo decir lo que quieres hacer en tu ejemplo de juguete).

Después de buscar, obtuve esta pista: https://instructobit.com/tutorial/108/How-to-share-global-variables-between-files-in-Python

la clave es: active la función para llamar al variabel que se establece en global si una función está activada.

A continuación, vuelva a importar el variabel desde ese archivo.

Te doy el ejemplo duro para que puedas entender:

archivo chromy.py

 from selenium import webdriver from selenium.webdriver.chrome.options import Options def opennormal(): global driver options = Options() driver = webdriver.Chrome(chrome_options=options) def gotourl(str): url = str driver.get(url) 

archivo tester.py

 from chromy import * #this command call all function in chromy.py, but the 'driver' variable in opennormal function is not exists yet. run: dir() to check what you call. opennormal() #this command activate the driver variable to global, but remember, at the first import you not import it #then do this, this is the key to solve: from chromy import driver #run dir() to check what you call and compare with the first dir() result. #because you already re-import the global that you need, you can use it now url = 'https://www.google.com' gotourl(url) 

Esa es la forma en que llama a la variable global que establece en una función. saludos no te olvides de dar crédito

Simplemente ponga sus globales en el archivo que está importando.

Todas las respuestas dadas son incorrectas. Es imposible globalizar una variable dentro de una función en un archivo separado.