2015-09-02 6 views
1

Я хочу запустить файл mybat.bat, расположенный в MyFolder, который отличается от текущего каталога. Я использовал следующий код:Запуск командного файла в другом каталоге в python

subprocess.Popen(["mybat", MyArg], 
        cwd=MyFolder, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE, 
        stdin=subprocess.PIPE) 

Однако, я получаю следующее сообщение об ошибке:

"WindowsError: [Error 2] The system cannot find the file specified" 

Следует отметить, что, если я заменю mybat с другой программой в PATH, такие как notepad она работает абсолютно нормально.

+0

Да. У меня есть файл mybat.bat в MyFolder. – MZX

ответ

0

добавление оболочки = верное командование решило проблему.

+0

вы можете избежать 'shell = True', если вы предоставите явное расширение' .bat' и полный путь к bat-файлу, если ошибка сохраняется. См. [Этот ответ о различии между тем, как поиск исполняемого файла отличается в случаях 'shell = False | True'] (http://stackoverflow.com/a/25167402/4279). Посмотрите на [вопросы Windows в информации тега subprocess] (http://stackoverflow.com/tags/subprocess/info) – jfs

1

Рабочий каталог изменяется только в дочернем процессе, то есть cwd=MyFolder не делает os.path.join(MyFolder, "mybat.bat") доступным. Попробуйте:

p = Popen([os.path.join(MyFolder, "mybat.bat"), MyArg], cwd=MyFolder) 

Вы могли бы use %~dp0 inside your bat-file, to get the directory where the bat-file resides вместо cwd=MyFolder в @eryksun suggested.

+0

Спасибо Себастьян. Решение также решило проблему. – MZX

+0

Правильно написанный пакетный файл вообще не требует установки 'cwd' для поиска файлов по отношению к самому себе. Он должен использовать '% ~ dp0', чтобы получить полностью определенный путь к пакетному файлу, т. Е. [D] rive и [p] ath .bat-файла (аргумент командной строки 0). – eryksun

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