2015-05-28 2 views
1

Я хочу, чтобы запустить следующую os.system команду в качестве подпроцесса для того, чтобы узнать идентификатор процесса, так как я хочу, чтобы иметь возможность выполнитьзапустить команду os.system, как подпроцесс питона

proc.terminate() 

Беллоу os.system() Команда, которая работает. Обратите внимание, что команда bellow уже открывает подоболочку, так как это делает то, что делает setview, а затем выполняет скрипт python внутри этой подоболочки и затем выходит из этой подоболочки.

os.system("/usr/atria/bin/cleartool setview -exec '/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py' testUser__project_5_0_myProject_001") 

Я попытался

import subprocess 
cmd = "/usr/atria/bin/cleartool setview -exec '/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py' testUser__project_5_0_myProject_001" 
p=subprocess.Popen(cmd.split(), shell=True) 

Взято из этой StackOverflow резьбы: How to determine pid of process started via os.system Но это только выполняет первую /usr/atria/bin/cleartool, а не другие команды. Кто-нибудь знает, как написать подоболочку, эквивалентную моему вызову os.system?

Заранее спасибо.

+0

см http://stackoverflow.com/questions/7989922/opening-a-process-with-popen-and-getting-the-pid – hardythe1

ответ

0

.split не делает вам никаких выгод, потому что у вас есть пробелы внутри кавычек, которые вы не хотите разделить. Либо передать строку непосредственно, и пусть оболочки разделения ручки аргумент:

cmd = "/usr/atria/bin/cleartool setview -exec '/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py' testUser__project_5_0_myProject_001" 
p=subprocess.Popen(cmd, shell=True) 

Или разделить команду вручную:

cmd = [ 
    "/usr/atria/bin/cleartool", 
    "setview", 
    "-exec", 
    # single quotes in the argument no longer required, as we're not going through the shell 
    "/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py", 
    "testUser__project_5_0_myProject_001" 
] 
p = subprocess.Popen(cmd) 
+0

Это была проблема, работает отлично теперь. Благодарю. – anders

+0

@anders: 'shlex.split()' может использоваться для получения списка. Здесь вам не нужно 'shell = True'. – jfs

-1

Почему вы разделив вашу команду? Не используйте cmd.split(). Попробуйте это:

import subprocess 
cmd = "/usr/atria/bin/cleartool setview -exec '/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py' testUser__project_5_0_myProject_001" 
p=subprocess.Popen([cmd], stdout=subprocess.PIPE,shell=True) 
out, err = p.communicate() 
print out 
+0

Это попытается запустить исполняемый файл под названием '/ usr/atria/bin/cleartool setview ...', то есть все аргументы будут обрабатываться как часть имени исполняемого файла – Eric