2016-01-29 4 views
-2

Я попытался написать код, который может легко выполнять коды python.библиотека подпроцессов не работала правильно для команды `py setup.py py2exe`

, но когда я использовал subprocess библиотеку такой:

import subprocess 
print(subprocess.Popen("py setup.py install", shell = True, stdout = subprocess.PIPE).stdout.read()) 
print(subprocess.Popen("py setup.py py2exe", shell = True, stdout = subprocess.PIPE).stdout.read()) 

Я видел только этот результат

b'' 

пожалуйста, помогите мне, пожалуйста

+0

Почему вы печатаете подпроцессы? Предложите взглянуть на [документацию python] (https://docs.python.org/3/library/subprocess.html) –

+0

@ oystein-hr Я печатаю 'subprocess.Popen (...). Stdout.read () 'Я видел страницу много раз, но я все еще не могу использовать' subprocess' для моего проекта :( –

ответ

0

Скорее всего команды, которые вы пытаетесь запустить производят a stderr, код которого не отображается. Можно отправить сообщения stderr на номер stdout, если вы не хотите обрабатывать его отдельно.

В подпроцессе, который относительно безопасен, я использую другую команду. И я сломаю его немного, а не одну длинную линию.

import subprocess 

p = subprocess.Popen("python filedoesntexist", 
        shell=True, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 
print(p.stdout.read()) 

Смотрите, что я добавил параметр stderr=subprocess.STDOUT, это посылает все сообщения об ошибках в stdout. В subprocess пытается запустить "python filedoesntexist" и так filedoesntexist это файл, который не существует, он будет print это сообщение:

b"python: can't open file 'filedoesntexist': [Errno 2] No such file or directory\n" 

Но вы можете просто хочу, чтобы получить string вместо bytes, и вы можете добавить параметр universal_newlines=True так:

p = subprocess.Popen("python filedoesntexist", 
        shell=True, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT, 
        universal_newlines=True) 
print(p.stdout.read()) 

Теперь она печатает только string так:

python: can't open file 'filedoesntexist': [Errno 2] No such file or directory 

Для получения дополнительной информации посетите python documentation


Редактировать

документация рекомендует использовать run(), что может быть сделано, как это (обновляется после комментариев от JF Sebastian):

subprocess.run(["python", "filedoesntexist"]) 

Если вам необходимо обработать stdout, добавьте параметры, описанные ранее в примерах Popen.

+1

(1) нет причин использовать 'shell = True' здесь. (2) OP, вероятно, хочет' subprocess. check_call ([sys.executable, 'setup.py', 'py2exe']) '(выход не используется) – jfs

+0

(1) Если у меня нет' shell = True', он не будет работать. (2) 'subprocess.check_call()' был заменен на 'subprocess.run()' в 3.5 в соответствии с документацией. (3) Если я немного отредактирую пример 'subprocess.run()', я могу удалить 'shell = True' :) –

+1

(1) пример кода в моем комментарии показывает, как избежать 'shell = True' (2)' subprocess.run() 'рекомендуется на Python 3.5+. Это не означает, что 'check_call()' устарел (заменен). Во всяком случае, дело в том, что вам вообще не нужно записывать вывод (если все, что вы делаете, это распечатать его) – jfs