2016-05-27 3 views
1

Когда я запускаю команду через подпроцесс, я получаю статус выхода 1 без моей печати или ошибки.Подпроцесс возвращает статус выхода 1

вот мой код:

def generate_model(self): 
     if not ((self.username == None) or (self.password == None) or (self.database == None)): 
      cmd = "python -m pwiz -e %s -H %s -u %s -P %s %s > %s"%(self.engine,self.host,self.username,self.password,self.database,self.database+".py") 
      print subprocess.check_call(cmd) 
     else: 
      raise ValueError 

команда запрашивает ввод один раз открыт терминал. После этого он закрывается с exit status 1

Когда я запускаю ту же команду непосредственно в командной строке, он отлично работает

+1

Вы пытались поместить свою команду в массив с каждой отдельной строкой? i.e '['python', '-m', 'pwiz']' ... Вы также можете использовать 'shlex.split'. – Idos

+0

Да, я пробовал это, даже если это возвращает код выхода 1 – Harwee

+0

. Рекомендованный @Idos дал действительно хороший, так как он необходим для предотвращения ввода команды. Никогда не создавайте команды как строки. Чтобы решить проблему, вы должны напечатать 'cmd' и запустить программу. Использование '>' redirection может потребовать 'shell = True' для установки' check_call() '. –

ответ

2

subprocess.check_call() не запускает оболочку по умолчанию, и поэтому оператор перенаправления > не будет работать. Чтобы перенаправить стандартный вывод, передать stdout параметр вместо:

with open(filename, 'wb', 0) as file: 
    check_call([sys.executable, '-m', 'pwiz', '-e', ...], stdout=file) 

Похожие: Python subprocess.check_output(args) fails, while args executed via Windows command line work OK.

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