2015-03-16 3 views
0

Я написал функцию python, которая запускает другой скрипт python на удаленном рабочем столе с использованием PSTools (psexec). Я запускаю сценарий несколько раз, когда функция вызывается только один раз. Но когда я вызываю функцию несколько раз из другого файла, подпроцесс не запускается во втором вызове. Фактически, он немедленно покидает всю программу на второй итерации, не бросая никаких исключений или Traceback.Не удалось отладить скрипт python с подпроцессом

controlpc_clean_command = self.psexecpath + ' -s -i 2 -d -u ' + self.controlPClogin + ' -p ' + self.controlPCpwd + ' \\' + self.controlPCIPaddr + ' cmd.exe /k ' + self.controlPC_clean_code 

    logfilePath = self.psexeclogs + 'Ctrl_Clean_Log.txt' 
    logfile = file(logfilePath,'w') 

    try: 

    process = subprocess.Popen(controlpc_clean_command, stdout = subprocess.PIPE,stderr = subprocess.PIPE) 


    for line in process.stderr: 
     print "** INSIDE SUBPROCESS STDERR TO START PSEXEC **\n" 
     sys.stderr.write(line) 
     logfile.write(line) 


    process.wait() 

    except OSError: 
     print "********COULD NOT FIND PSEXEC.EXE, PLEASE REINSTALL AND SET THE PATH VARIABLE PROPERLY********\n" 

Приведенный выше код работает некогда. Даже если я запускаю его из другого файла python с разными параметрами, он работает хорошо. Проблема возникает, когда я вызываю функцию более одного раза из одного файла, а затем во втором вызове функция завершает работу после печати «** ВНУТРЕННЯЯ СУБПРОЦЕССА STDERR ДЛЯ ПУСКА PSEXEC ** \ n», и она даже не печатает ничего в основной программе после этого.

Я не могу понять, как отладить эту проблему. Поскольку я совершенно не знаю, где программа идет после печати этой строки. Как мне отладить это?

Edit: После выполнения некоторых поиска, я добавил стандартный вывод, STDERR = subprocess.communicate()

после subprocess.Popen строки в моем сценарии. Теперь я могу продолжить код, но с одной проблемой. Теперь ничего не записывается в файл журнала «Ctrl_Clean_Log.txt» после добавления subprocess.communicate() !! Как я могу писать в файле, а также продолжать работу с кодом?

ответ

1

Возможно, ваш первый процесс застрял в ожидании и блокировании других процессов.

https://docs.python.org/2/library/subprocess.html

Popen.wait() 
    Wait for child process to terminate. Set and return returncode attribute. 

Warning This will deadlock when using stdout=PIPE and/or stderr=PIPE and the 
child process generates enough output to a pipe such that it blocks waiting 
for the OS pipe buffer to accept more data. Use communicate() to avoid that. 
+0

Я только отредактировал мой вопрос с ответом вы дали. Проблема в том, что теперь мой процесс работает хорошо, но файлы журнала больше не записываются. Не могли бы вы рассказать, как я могу писать в файл журнала с помощью process.communicate? – user3565150

Смежные вопросы