2016-07-21 3 views
0

У меня есть скрипт python, который вызывает другой скрипт python из другого каталога. Для этого я использовал subprocess.Popen:Вызов скрипта python с аргументами с использованием подпроцесса

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

Эта часть работает хорошо, потому что лог-файл можно увидеть ошибки, которая происходит на вызываемом скрипте , Вот сценарий питона называется:

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 не передает аргументы этому скрипту. Я думаю, что я делаю что-то неправильно, у кого-то есть идея?

+0

Почему вы используете 'subprocess' вообще? Почему бы просто не «импортировать» его и не вызвать соответствующую функциональность напрямую? – jonrsharpe

+0

@jonrsharpe, потому что скрипт, вызываемый подпроцессом, будет отличаться каждый раз. Таким образом, зависимости nerver одинаковы. Более того, этот скрипт не находится в том же проекте python, что и тот, который использует подпроцесс. –

+0

Вы можете импортировать по имени скрипта, это не проблема. И неясно, что вы подразумеваете под * «не в том же проекте python» *, если они оба установлены на одной машине, что не должно быть проблемой. – jonrsharpe

ответ

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 до назначения (первый элемент является название программы).