使用子进程调用带有参数的python脚本

时间:2016-07-21 14:04:38

标签: python arguments subprocess popen

我有一个python脚本,它从另一个目录调用另一个python脚本。为此,我使用了subprocess.Popen

import os
import subprocess

arg_list = [project, profile, reader, file, str(loop)]

其中所有args是字符串,如果没有被隐含地转换

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方法不会将参数传递给该脚本。我想我做错了什么,有人有想法吗?

1 个答案:

答案 0 :(得分:2)

当您将参数传递给新进程时,它们会按位置传递,父进程中的名称不会存在,只会存在值。你需要添加:

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的长度(第一个元素是程序的名称)。