0

を介して別のPythonスクリプトを繰り返し呼び出すラッパーPythonスクリプトがありますos.system。これは十分に機能しますが、サブシェルを呼び出してモジュールを何度もインポートすると、パフォーマンスが大幅に低下します。これをよりエレガントでパフォーマンスの高いものに変換するにはどうすればよいですか?

counter = 0
for thing in list_of_stuff:
    os.system("python inner_script.py %s result_%s" % (thing, counter)
    counter += 1

私はこれをすべてラッパーで実行したいと思いますが、それが唯一または最良の方法である場合は、inner-script.pyを変更できます。

関連する場合、環境はWindows上のPython2.7です。

編集:コマンドラインパラメータを理解していないため、inner_scriptをインポートするだけではありません。

import inner_script    
counter = 0
for thing in ['TR2','TR5']:
    inner_script('%s result_%s' % (thing, counter))
counter += 1

結果:

C:\> python xx-wrapper.py

inner_script [input features] [output workspace]

これは、inner_script.pyによって返される使用法メッセージです。

if len(sys.argv) < 3:
    print usage
    exit()

in_features = sys.argv[1]
out_folder  = sys.argv[2]

main(in_features, out_folder)
4

3 に答える 3

3

目標は、次のように記述できるようにすることです。

from inner_module import some_function

for counter, thing in enumerate(list_of_stuff):
    some_function(thing, counter)

これを実現するには、処理コードを内部スクリプトから別の関数に移動します。新しいモジュールに配置するか、スクリプトの名前を変更して関数をそのままにしておくことができます。例inner-script.py

import sys
# tons of other imports..

# parse args
thing, counter = sys.argv[1:]

# do something..
print thing, counter

に変換することができますinner_module.py

import sys
# tons of other imports..

def some_function(thing, counter):
    print thing, counter

def main():
    # parse args
    thing, counter = sys.argv[1:]

    # do something..
    some_function(thing, counter)

if __name__=="__main__":
    main()
于 2013-02-08T18:51:17.110 に答える
2

inner-script.pyスクリプトが実行するタスクの周りにクラスを作成します。

for thing in list_of_stuff:
    x = __import__('inner-script')
    x.className(thing, counter)

これは十分に効率的であるはずです。


または、inner-script.pyを変更できない/変更しない場合は、Python内から呼び出して、スクリプトが読み取ることができるlocal()またはglobal()変数として変数を渡す方法があります。あなたの例では、実行時にパラメータを渡しました:

x = __import__('inner-script', globals(), (thing, counter), [], -1)

その後、あなたがなりたいものが何であれ、より多くの情報がここにあります

于 2013-02-08T18:30:45.183 に答える
0

Torxedの回答とそれに伴う解説のおかげで、「inner_scriptを変更しない」シナリオで機能するように見えるものがあります。最初の目標は達成されましたが、構築の過程で、 JFセバスティアンのテンプレートの後にモジュールに再キャストinner-scriptすることが最善の方法であることが明らかになりました。これで正しく機能するかどうかわからないことが多すぎますが、それ答えなので、それを必要とする可能性のある他の人に任せます。inner_script

counter = 0
for thing in ['1st','2nd', '3rd']:
    output = '%s_%s' % (thing, counter)
    sys.argv.insert(1, thing)
    sys.argv.insert(2, output)

    if counter == 0:
        x = __import__('inner_script', sys.argv)
    else:
        reload(x)

    del sys.argv[2] # in reverse order so as not to change index #'s before done
    del sys.argv[1] 
    counter += 1

結果:

Processing 1st into 1st_0
Processing 2nd into 2nd_1
Processing 3rd into 3rd_2
于 2013-02-12T19:05:11.817 に答える