2016-06-25 9 views
0

私はmain.pyファイルに​​を使って引数を解析しました。 global_vars.pyファイルに定義されているいくつかの変数があり、このファイルはmain.pyと他のファイルに含まれています。argparseによって解析された引数は他のファイルではアクセスできません

グローバル変数に解析済みの引数を割り当てていますが、main.py以外のファイルでこれらのグローバル変数にアクセスしようとすると、Noneが返されます。私が紛失しているものはありますか、それとも​​の名前空間の問題ですか?

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

グローバルステートを使用しようとするのではなく、適切な引数を使用してエントリポイント関数を呼び出すことをおすすめします。これがある文脈の詳細をいくつか表示できますか? – jonrsharpe

+0

他のファイルからこれらの変数にどのようにアクセスしようとしているかを示す必要があります。引数の解析が行われる前に、他のファイルが実行されている可能性があります。 – arghbleargh

+0

'bhavcopy_dir = args.b'は' vars_dict'変換なしで動作します。 (これはあなたがより大きな質問に変わるわけではない) – hpaulj

答えて

0

あなたは直接のpythonファイルを実行する場合は、if __name__ == "__main__":の内側に置かれた任意のコードが実行のみされることに注意してください。したがって、そのコードがあなたのglobal_var.pyであると仮定し、単にglobal_varをインポートするだけであれば、そのコードは実行されておらず、変数は決して初期化されません。変数が実際に作成されているかどうかを確認するには、いくつかのprint文を入れてください。

0

​​は名前空間を持つ唯一のものではありません。すべてのモジュール(ファイル)と関数には1つがあります。​​はクラスargparse.Namespaceのオブジェクトを返すだけで、モジュールの名前空間のように扱うことができます。つまり、args.name構文を使用してそのオブジェクト内の項目にアクセスします。

あなたは

bhavcopy_dir = args.b 

bhavcopy_dirのようなものをやったらmain名前空間の引数です。その名前はmainのどこか他の場所でアクセスできます。しかし、mainをインポートすると、アクセスが変更されます。

main.pyの詳細を参照する必要があります。私はあなたがglobal_vars.var1とそこに定義された変数にアクセスし、それがimport global_vars

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

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

含まれる疑いがあります。 *インポートでは、var1がグローバル(メイン)名前空間にロードされます。

import argparse​​名前空間を読み込みます。 argparse.ArgumentParserはそのモジュール内のオブジェクト(クラス)にアクセスしています。

また、if __name__...ブロックのインポートがどのように変更されるのか説明する必要がありますか?

あなたの質問は、モジュール、名前空間、および輸入に関するもので、​​についてのものではありません。

コメントに示唆されているように、args変数を渡し、必要に応じてその属性にアクセスするだけで便利なことがよくあります。たぶん、ファイルのこのペアは、(argparseなし)の問題を説明します

main1.pyファイル:

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

sub1.pyファイル:

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

var1sub1で定義されたmain1からアクセス可能です(正しい名前で)、値はに設定されていますブロックはインポートによって使用されません。

main1に設定された変数は、インポートされたモジュールではアクセスできません。

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 
関連する問題