0

我有一个包装 python 脚本,它通过重复调用另一个 python 脚本os.system。这工作得很好,但是调用子 shell 并一次又一次地导入模块会对性能造成很大影响。我怎样才能将其转换为更优雅和高性能的东西?

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 上的 Python 2.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 Sebastian 的模板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 回答