简体   繁体   中英

Calling a python script with arguments using subprocess

I have a python script which call another python script from another directory. To do that I used subprocess.Popen :

import os
import subprocess

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

where all args are string if not converted implicitely

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()

This part works well, because of the log file I can see errors that occurs on the called script. Here's the python script called:

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()

When I launch my subprocess.Popen, I have an error from the called script which tell me that 'project' is not defined . It looks the Popen method doesn't pass arguments to that script. I think i'm doing something wrong, someone has an idea ?

When you pass parameters to a new process they are passed positionally, the names from the parent process do not survive, only the values. You need to add:

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()

We are testing the length of sys.argv before the assignment (the first element is the name of the program).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM