Windows не може знайти файл на subprocess.call ()


103

Я отримую таку помилку:

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

Мій код:

subprocess.call(["<<executable file found in PATH>>"])

Windows 7, 64 біт. Python 3.x останній, стабільний.

Якісь ідеї?

Дякую,


і що це за виконаний файл?
SilentGhost

Виконана частина Android Android SDK
Шрі,

2
І це є доступна на PATH
Sri

ви можете запустити його з командного рядка?
SilentGhost

Трохи передумов того, що я намагаюся досягти. Це для Opendevice - проекту з відкритим кодом для перетворення програм HTML5 у конкретні програми. Я намагаюся замінити os.system () в bitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/… на subprocess.call ()
Шрі

Відповіді:


178

Коли команда є вбудованою оболонкою, додайте до виклику 'shell = True'.

Наприклад, dirви введете:

import subprocess
subprocess.call('dir', shell=True)

Цитувати з документації:

Єдиний раз, коли вам потрібно вказати shell = True в Windows, це коли команда, яку ви хочете виконати, вбудована в оболонку (наприклад, dir або copy). Вам не потрібна shell = True, щоб запустити пакетний файл або виконаний на основі консолі.


14
Це тому, що немає виконуваного виконуваного файлу, dir.exeпоки є /bin/ls* nix. dirреалізується CMD.EXE так само, як cdреалізується bash .
Апалала

1
Це сильно не рекомендується. docs.python.org/2/library/…
nu everest

11
@nueverest Тільки тоді, коли командний рядок побудований із зовнішнього вводу
Jirka

Альтернатива (більш безпечна для зовнішнього входу), щоб отримати PATHвід os.environі пошуку вручну.
asmeurer

Дивіться stackoverflow.com/a/32799942/3912576 для набагато більш прийнятного рішення цієї проблеми.
SimonBiggs

33

В Windows, я вважаю, що subprocessмодуль не виглядає, PATHякщо ви не переходите,shell=True тому що він використовується CreateProcess()поза кадром. Однак це shell=Trueможе бути ризиком для безпеки, якщо ви передаєте аргументи, які можуть виходити за межі вашої програми. Щоб subprocessвсе-таки змогти знайти правильний виконуваний файл, ви можете використовувати shutil.which. Припустимо, виконуваний файл у вашому PATHімені frob:

subprocess.call([shutil.which('frob'), arg1, arg2])

(Це працює на Python 3.3 і вище.)


4
Будь-який варіант python 2?
Нарамсім

1
Ти маєш рацію, і ти пропонуєш правильний спосіб виправити це. Цю відповідь слід прийняти. В даний час прийнята відповідь не пояснює причину і пропонує виправити, що може бути небезпечним у деяких випадках.
Девід Ференчі Рогожан

18

У Windows вам потрібно зателефонувати через cmd.exe. Як згадував Апалала, команди Windows реалізуються в cmd.exe не як окремі виконувані файли.

напр

subprocess.call(['cmd', '/c', 'dir'])

/ c вказує cmd виконати команду follow

Це безпечніше, ніж використання shell = True, що дозволяє вводити оболонки.


Як я можу тримати екран відкритим?
Мондра

2
@Moondra, Якщо я вас правильно зрозумів, спробуйте /kзамість цього /c. Введіть cmd /?у командному рядку деталі.
User5910

@ User5910 Дякую Спробую, коли я отримаю можливість.
Мондра

3

Якщо ви використовуєте powershell, то в ньому буде subprocess.call(['powershell','-command','dir']). Powershell підтримує велику частину команд POSIX


2

Після багатого чесання голови я виявив, що запуск файлу, який знаходиться в C: \ Windows \ System32 \ під час запуску 32-бітної версії python на 64-бітній машині, є потенційною проблемою, оскільки Windows намагається переохолодити процес, і переадресація викликів на C: \ Windows \ System32 на C: \ Windows \ SysWOW64.

Я знайшов приклад, як це виправити тут: http://code.activestate.com/recipes/578035-disable-file-system-redirector/


1

Цитувати з документації:

"До Python 3.5, ці три функції містили API високого рівня для підпроцесу. Тепер ви можете використовувати run () у багатьох випадках, але багато існуючих код викликає ці функції."

ТАК: замість subprocess.call використовуйте subprocess.run для Python 3.5 і вище


Вірно і корисно.
Ерік Г. Хагстром

0

Я зіткнувся з тією ж проблемою, коли я телефонував PHP. Причина в тому, що PHP не в PATH, тому команда PHP не знайдена. Але PowerShell виявив, що він існує в поточному місці, і він пропонує замінити "PHP" на ". \ PHP", якщо я довіряю цій команді. Тоді це добре працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.