使用子进程调用带参数的 python 脚本
Calling a python script with arguments using subprocess
我有一个 python 脚本,它从另一个目录调用另一个 python 脚本。为此,我使用了 subprocess.Popen
:
import os
import subprocess
arg_list = [project, profile, reader, file, str(loop)]
如果没有隐式转换,所有参数都是字符串
f = open(project_path + '/log.txt','w')
proc = subprocess.Popen([sys.executable, python_script] + arg_list, stdin=subprocess.PIPE, stdout=f, stderr=f)
streamdata = proc.communicate()[0]
retCode = proc.returncode
f.close()
这部分工作正常,因为日志文件我可以看到调用脚本上发生的错误。这是名为 python 的脚本:
import time
import csv
import os
class loading(object):
def __init__(self, project=None, profile=None, reader=None, file=None, loop=None):
self.project=project
self.profile=profile
self.reader=reader
self.file=file
self.loop=loop
def csv_generation(self):
f=open(self.file,'a')
try:
writer=csv.writer(f)
if self.loop==True:
writer.writerow((self.project,self.profile,self.reader))
else:
raise('File already completed')
finally:
file.close()
def main():
p = loading(project, profile, reader, file, loop)
p.csv_generation()
if __name__ == "__main__":
main()
当我启动 subprocess.Popen 时,被调用的脚本出现错误,告诉我 'project' is not defined
。看起来 Popen 方法没有将参数传递给该脚本。我想我做错了什么,有人有想法吗?
当您将参数传递给新进程时,它们是按位置传递的,父进程的名称不会保留,只有值。您需要添加:
import sys
def main():
if len(sys.argv) == 6:
project, profile, reader, file, loop = sys.argv[1:]
else:
raise ValueError,("incorrect number of arguments")
p = loading(project, profile, reader, file, loop)
p.csv_generation()
赋值前我们正在测试sys.argv
的长度(第一个元素是程序名)
我有一个 python 脚本,它从另一个目录调用另一个 python 脚本。为此,我使用了 subprocess.Popen
:
import os
import subprocess
arg_list = [project, profile, reader, file, str(loop)]
如果没有隐式转换,所有参数都是字符串
f = open(project_path + '/log.txt','w')
proc = subprocess.Popen([sys.executable, python_script] + arg_list, stdin=subprocess.PIPE, stdout=f, stderr=f)
streamdata = proc.communicate()[0]
retCode = proc.returncode
f.close()
这部分工作正常,因为日志文件我可以看到调用脚本上发生的错误。这是名为 python 的脚本:
import time
import csv
import os
class loading(object):
def __init__(self, project=None, profile=None, reader=None, file=None, loop=None):
self.project=project
self.profile=profile
self.reader=reader
self.file=file
self.loop=loop
def csv_generation(self):
f=open(self.file,'a')
try:
writer=csv.writer(f)
if self.loop==True:
writer.writerow((self.project,self.profile,self.reader))
else:
raise('File already completed')
finally:
file.close()
def main():
p = loading(project, profile, reader, file, loop)
p.csv_generation()
if __name__ == "__main__":
main()
当我启动 subprocess.Popen 时,被调用的脚本出现错误,告诉我 'project' is not defined
。看起来 Popen 方法没有将参数传递给该脚本。我想我做错了什么,有人有想法吗?
当您将参数传递给新进程时,它们是按位置传递的,父进程的名称不会保留,只有值。您需要添加:
import sys
def main():
if len(sys.argv) == 6:
project, profile, reader, file, loop = sys.argv[1:]
else:
raise ValueError,("incorrect number of arguments")
p = loading(project, profile, reader, file, loop)
p.csv_generation()
赋值前我们正在测试sys.argv
的长度(第一个元素是程序名)