使用子进程在python脚本中使用输入调用python脚本

Calling a python script with input within a python script using subprocess

我有一个脚本a.py,在执行时,它将向用户询问某些查询,并将输出设置为JSON格式。使用python子进程,我可以从另一个名为b.py的脚本调用这个脚本。除了我不能得到变量中的输出之外,所有事情都按预期工作?我用python 3做这个。


使用subprocess模块从另一个脚本调用python脚本,并传递一些输入并获取其输出:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
import os
import sys
from subprocess import check_output

script_path = os.path.join(get_script_dir(), 'a.py')
output = check_output([sys.executable, script_path],
                      input='
'
.join(['query 1', 'query 2']),
                      universal_newlines=True)

其中,这里定义了get_script_dir()函数。

更灵活的选择是导入模块a并调用函数,以获得结果(确保a.py使用if __name__=="__main__"保护,以避免在导入时运行不需要的代码):

1
2
3
4
#!/usr/bin/env python
import a # the dir with a.py should be in sys.path

result = [a.search(query) for query in ['query 1', 'query 2']]

您可以使用mutliprocessing在单独的进程中运行每个查询(如果执行的查询占用CPU资源,那么它可能会提高时间性能):

1
2
3
4
5
6
7
8
#!/usr/bin/env python
from multiprocessing import freeze_support, Pool
import a

if __name__ =="__main__":
   freeze_support()
   pool = Pool() # use all available CPUs
   result = pool.map(a.search, ['query 1', 'query 2'])

另一种方法是使用内置功能exec
此函数获取一个字符串python代码并执行它
要在脚本文件中使用它,只需将cx1〔7〕作为文本文件即可,例如:

1
2
3
4
#dir is the directory of a.py
#a.py, for example, contains the variable 'x=1'
exec(open(dir+'\\a.py').read())
print(x) #outputs 1