Использование перенаправления ввода с Popen в python

Мне нужно использовать перенаправление потока в вызове Popen в python, чтобы использовать файл bat с вином. Мне нужно сделать это:

wine32 cmd  < file.bat

Он работает, когда я запускаю его вручную с терминала, однако, когда я пытаюсь вызвать его из python:

proc = Popen('wine32 cmd < file.bat',stdout = PIPE)

Я получил сообщение об ошибке: Нет такого файла или каталога

Как с этим справиться?

Спасибо


person jmmk    schedule 24.01.2015    source источник


Ответы (2)


Попробуй это:

import sys

#...

with open('file.bat', 'r') as infile:
    subprocess.Popen(['wine32', 'cmd'], 
        stdin=infile, stdout=sys.stdout, stderr=sys.stderr)

Убедитесь, что каждый аргумент wine32 является отдельным элементом списка.

person PM 2Ring    schedule 24.01.2015
comment
При настройках по умолчанию None перенаправление не происходит; дескрипторы дочерних файлов будут унаследованы от родителя, поэтому нет необходимости иметь там stdout, stderr. - person Antti Haapala; 26.01.2015
comment
@AnttiHaapala: А, хорошо. Как вы могли догадаться, я мало играл с подпроцессом. :) Это напомнило мне, что я действительно должен обновить свои старые скрипты, которые используют os.popen и друзей... - person PM 2Ring; 26.01.2015
comment
@jmmk: stdout=sys.stdout, stderr=sys.stderr, вероятно, не нужны - проверьте это. - person jfs; 27.01.2015

возможно, вы можете проверить эту ветку.

from subprocess import Popen
p = Popen("batch.bat", cwd=r"C:\Path\to\batchfolder")
stdout, stderr = p.communicate()
person agaust    schedule 24.01.2015
comment
Но я звоню из линукса через вино. Popen(file.bat... здесь не работает - person jmmk; 24.01.2015
comment
вы звоните в режиме ожидания? - person agaust; 24.01.2015
comment
Что ты имеешь в виду? Я запускаю скрипт Python просто через gnome-терминал - person jmmk; 24.01.2015
comment
почему бы не использовать простой Python в Ubuntu? там файл .bat может быть выполнен с бездействием (поскольку бездействие используется по умолчанию для Windows). Раньше я использовал его, если хочу запустить файл .bat ... если терминал gnome будет ошибочным, потому что он явно не поддерживает файл .bat в терминале gnome. - person agaust; 24.01.2015
comment
Не убунту. bat может быть выполнен с использованием перенаправления потока, как я писал. Мне нужно, чтобы перенаправление потока '‹' работало - person jmmk; 24.01.2015
comment
может быть, для модуля Popen вы можете попробовать это? Popen(r"wine32 cmd < file.bat",stdout = PIPE) - person agaust; 24.01.2015
comment
Это не работает. Я также пробовал Popen(['wine32', 'cmd', '<', 'file.bat'], stdout = PIPE) Тогда я не получаю ошибок, но код не запускается - person jmmk; 24.01.2015
comment
можно ли использовать Popen, как вы написали, удалось вызвать cmd? - person agaust; 24.01.2015