У меня есть пакетный скрипт, который открывает файл Java .jar. Когда я дважды щелкаю файл .bat, он нормально открывает .jar. Код .bat:
start javaw -Djava.library.path = "%~dp0bin" -jar bin\SoarJavaDebugger.jar %1 %2 %3 %4 %5
Теперь я хочу запустить этот файл .bat из Python. Когда я использую os.system(BAT_PATH)
, я получаю всплывающее окно с сообщением:
«Windows не может найти «javaw».»
и терминальное сообщение с тем же эффектом.
(Я хочу запустить этот сценарий из Python, чтобы я мог запустить файл Jar, используя некоторые другие настройки, которые выполняет файл .bat. Однако здесь я показываю только соответствующую часть файла .bat. Я тестировал удаление всего остального из файл .bat, и это не влияет на эту проблему.)
Обновлено: Зачем вообще использовать файл .bat? Я не писал этот файл .bat; он привязан к пакету программного обеспечения, который я вызываю с помощью моего сценария Python, и я бы предпочел не дублировать все, что он делает в моем сценарии, если это возможно, и не обходить обычную цепочку обработки вызываемого программного обеспечения.
Обычно я думаю, что эта ошибка означает, что моя папка Java bin не находится в моей переменной среды %PATH%
, но я дважды проверил, что она есть, как в моей среде Python (используя echo $env:PATH
в моем терминале VSCode), так и в файле .bat. среде (используя echo %PATH%
прямо перед start javaw
, а также используя os.system("echo %PATH%")
в моем скрипте Python прямо перед вызовом os.system(BAT_PATH)
). Путь к папке Java bin успешно распечатывается в каждом случае.
Мой путь к Java — C:\\Program Files\\Eclipse Adoptium\\jdk-21.0.2.13-hotspot\\bin
, и я дважды проверил наличие javaw.exe.
Я пробовал использовать опцию /I
в команде start
, без каких-либо изменений.
Я попробовал заменить os.command(BAT_PATH)
на subprocess.Popen(BAT_PATH, shell=False)
, без каких-либо изменений.
Обновлено: Использование where javaw
возвращает INFO: Could not find files for the given pattern(s).
И написание javaw.exe
с расширением не имеет никакого значения в вышеизложенном.
Я использую рабочий компьютер с Windows, на котором установлено программное обеспечение корпоративной безопасности, которое я не могу настроить. (У меня нет учетной записи администратора.) Может ли система безопасности помешать моему компьютеру использовать PATH
для поиска javaw
, даже если путь к нему указан в PATH
?
Я не хочу использовать команду CALL, которая жестко закодирует путь javaw.exe, потому что я хочу, чтобы этот сценарий работал на нескольких машинах, где путь Java может различаться.
Опять же, двойной щелчок по файлу .bat работает нормально. Он просто терпит неудачу при попытке запустить его из Python.
Почему он так себя ведет?
Я могу запустить файл, заменив строку .bat следующей:
start %~dp0bin\SoarJavaDebugger.jar %1 %2 %3 %4 %5
Но я бы предпочел оставить опцию -Djava.library.path
, чтобы гарантировать, что все, на что ссылается jar, правильно работает в различных системах.
И мне также хотелось бы знать, почему я получаю исходную ошибку.
Спасибо!
Вы пробовали использовать import subprocess
? См.: запуск bat-файла в Windows с использованием кода Python
@RufusL, Да, как уже говорилось в ОП, я попробовал подпроцесс без каких-либо различий (чтобы я мог поэкспериментировать с опцией оболочки).
Переменная локальной среды PATH
определяется по-разному в локальной среде при запуске командного файла вручную из командной строки, открываемой вручную, или при двойном щелчке по пакетному файлу в проводнике Windows по сравнению с локальной средой, в которой интерпретируется сценарий Python. Путь к папке C:\Program Files\Eclipse Adoptium\jdk-21.0.2.13-hotspot\bin
указан в переменной пользователя или в переменной системной среды PATH
? Как выполняется скрипт Python? Используется ли служба Windows или запланированное задание с другой учетной записью, например СИСТЕМОЙ?
Пожалуйста, посмотрите В чем причина того, что «X не распознается как внутренняя или внешняя команда, исполняемая программа или командный файл»? Самое простое решение — использовать в пакетном файле полное имя файла javaw.exe
, заключенное в "
, т. е. start "" "C:\Program Files\Eclipse Adoptium\jdk-21.0.2.13-hotspot\bin\javaw.exe" -Djava.library.path = "%~dp0bin" -jar bin\SoarJavaDebugger.jar %*
с текущим рабочим каталогом, установленным с помощью cd
в пакетном файле в каталог, содержащий подкаталог bin
с файлом SoarJavaDebugger.jar
.
Другое решение — изменить с помощью os.environ локальную переменную среды PATH
процесса Python в сценарии Python, чтобы убедиться, что путь к папке C:\Program Files\Eclipse Adoptium\jdk-21.0.2.13-hotspot\bin
находится в локальном PATH
, прежде чем вызывать subprocess.run()
для выполнения cmd.exe
для обработки пакетного файла.
Большое спасибо @Mofi за время, потраченное на диагностику. Это привело меня на правильный путь:
Проблема заключалась в том, что сценарий Python тонко искажал переменную PATH, добавляя к ней элементы с помощью «:» вместо «;». (Изначально код был написан для среды Mac.) Это привело к тому, что первый элемент PATH по умолчанию был объединен с вновь добавленными, и в этом случае первым элементом был путь Java.
Таким образом, хотя на первый взгляд казалось, что печать PATH из Python или .bat включает путь Java, на самом деле его там не было из-за «:». И сценарий, конечно же, работал нормально, если его не запускать из Python.
Проверьте, что PATHEXT установлен через Python, или посмотрите, исправит ли это вызов javaw.exe.