2016-07-21 24 views
0

Ich habe ein Python-Skript, das ein anderes Python-Skript aus einem anderen Verzeichnis aufruft. Zu tun, dass ich subprocess.Popen verwendet:Aufruf eines Python-Skripts mit Argumenten mit Subprozess

import os 
import subprocess 

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

wo alle args Zeichenfolge sind, wenn nicht implizit konvertiert

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

Dieser Teil funktioniert gut, weil die Protokolldatei kann ich Fehler sehen, die auf dem genannten Skript auftritt . Hier ist der Python-Skript namens:

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

Wenn ich meine subprocess.Popen starten, ich habe einen Fehler von der gerufenen Skript, das mir sagen, dass 'project' is not defined. Es sieht so aus, dass die Popen-Methode keine Argumente an dieses Skript übergibt. Ich denke, ich mache etwas falsch, hat jemand eine Idee?

+0

Warum verwenden Sie überhaupt 'subprocess'? Warum nicht einfach "importieren" und die entsprechende Funktionalität direkt aufrufen? – jonrsharpe

+0

@jonrsharpe, weil das von subprocess aufgerufene Skript jedes Mal anders sein wird. Abhängigkeiten sind also gleich. Außerdem befindet sich das Skript nicht im selben Python-Projekt wie dasjenige, das den Subprozess verwendet. –

+0

Sie können mit dem Namen des Skripts importieren, das ist kein Problem. Und es ist nicht klar, was Sie mit * "nicht im selben Python-Projekt" * meinen, wenn beide auf demselben Rechner installiert sind, was kein Problem sein sollte. – jonrsharpe

Antwort

2

Wenn Sie Parameter an einen neuen Prozess übergeben, werden sie positionsmäßig übergeben, die Namen aus dem übergeordneten Prozess überleben nicht, nur die Werte. Sie müssen hinzufügen:

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

wir die Länge sys.argv vor der Zuweisung zu testen sind (das erste Element ist der Name des Programms).

Verwandte Themen