2016-06-25 4 views
0

Ich habe Argumente analysiert, die argparse in meinen main.py-Dateien verwenden. Ich habe ein paar Variablen in der global_vars.py Datei definiert und diese Datei ist in main.py und anderen Dateien enthalten.Argumente, die von argparse analysiert werden, sind in anderen Dateien nicht verfügbar

Ich ordnet geparste Argumente globalen Variablen zu, aber wenn ich versuche, auf diese globalen Variablen über andere Dateien als main.py zuzugreifen, gibt es None zurück. Gibt es etwas, das ich vermisse, oder ist es ein Namespace-Problem für argparse?

if __name__ == "__main__": 

    parser = argparse.ArgumentParser(description='Accept arguments') 
    parser.add_argument('-n', help='enter period for which you want to do the sampling') 
    parser.add_argument('-b', help='enter directory for bhav copy') 
    parser.add_argument('-d', help='enter directory for deliverables') 
    parser.add_argument('-l', help='enter list type') 

    args = parser.parse_args(namespace=None) 
    var_dict = vars(args) 
    bhavcopy_dir=var_dict['b'] 
    deli_dir=var_dict['d'] 
    no_of_sessions=var_dict['n'] 
    list_type=var_dict['l'] 
+0

Anstatt zu versuchen, den globalen Status zu verwenden, warum rufen Sie nicht eine Einstiegspunktfunktion mit den entsprechenden Argumenten auf? Könntest du etwas mehr von dem Kontext zeigen, in dem dies ist? – jonrsharpe

+0

Sie müssen uns auch zeigen, wie Sie versuchen, aus anderen Dateien auf diese Variablen zuzugreifen. Vielleicht werden die anderen Dateien ausgeführt, bevor das Parsen der Argumente erfolgt ist. – arghbleargh

+0

'bhavcopy_dir = args.b' funktioniert ohne die' vars_dict' Konvertierung. (Nicht dass das deine größere Frage verändert) – hpaulj

Antwort

0

Beachten Sie, dass jeder Code, den Sie in der if __name__ == "__main__": wird nur gestellt ausführen, wenn Sie die Python-Datei direkt ausgeführt werden. Wenn also dieser Code Ihre global_var.py sein soll und Sie einfach global_var importieren, wird dieser Code nicht ausgeführt und Ihre Variablen werden nie initialisiert. Fügen Sie einige print-Anweisungen ein, um zu überprüfen, ob/wann Ihre Variablen tatsächlich erstellt werden.

0

argparse ist nicht die einzige Sache, die einen Namensraum hat. Jedes Modul (Datei) und jede Funktion hat eins. argparse gibt nur ein Objekt der Klasse argparse.Namespace zurück, das wie der Namensraum eines Moduls behandelt werden kann. Das heißt, Sie greifen auf Objekte in diesem Objekt mit der Syntax args.name zu.

Wenn Sie so etwas wie

bhavcopy_dir = args.b 

bhavcopy_dir ist ein Argument in der main Namespace getan haben. Sie können auf diesen Namen an anderer Stelle in main zugreifen. Wenn jedoch main importiert wird, ändert sich der Zugriff.

Wir müssen mehr von main.py sehen. Ich vermute, es

import argparse 
import global_vars 
# or is it 
# from global_vars import * 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    .... 
    args = ... 
    var1 = args.var1 

Mit import global_vars enthält, Sie Variablen dort mit global_vars.var1 definiert zugreifen. Mit dem * Import, var1 in den globalen Namespace (Haupt) geladen.

import argparse lädt den Namespace argparse. argparse.ArgumentParser greift auf ein Objekt (Klasse) innerhalb dieses Moduls zu.

Muss ich auch erklären, wie dieser if __name__... Block den Import ändert?

Ihre Frage bezieht sich auf Module, Namespaces und Importe, nicht so sehr auf argparse.

Wie in den Kommentaren vorgeschlagen, ist es oft praktisch, einfach die args Variable zu übergeben und auf ihre Attribute nach Bedarf zuzugreifen.

dieses Paar Dateien veranschaulichen die Probleme vielleicht kommen (ohne argparse)

main1.py Datei:

import sub1 
print(sub1.var1) 
var_from_main = 123 
sub1.foo(var_from_main) 
sub1.test() 

sub1.py Datei:

var1 = 345 
def test(): 
    print(var_from_main) 
def foo(var): 
    print(var) 
if __name__ == '__main__': 
    var1 = 'sub __main__ setting' 

var1 in sub1 definiert von main1 zugänglich ist (mit dem richtigen Namen), aber Wert ingesetztBlock wird nicht vom Import verwendet.

Die in main1 festgelegte Variable ist im importierten Modul nicht verfügbar.

1021:~/mypy$ python3 main1.py 
345 
123 
Traceback (most recent call last): 
    File "main1.py", line 5, in <module> 
    sub1.test() 
    File "/home/paul/mypy/sub1.py", line 3, in test 
    print(var_from_main) 
NameError: name 'var_from_main' is not defined 
Verwandte Themen