Скрипт .bat не может найти javaw при вызове из Python os.command

Основная проблема

У меня есть пакетный скрипт, который открывает файл 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, правильно работает в различных системах.

И мне также хотелось бы знать, почему я получаю исходную ошибку.

Спасибо!

Проверьте, что PATHEXT установлен через Python, или посмотрите, исправит ли это вызов javaw.exe.

DuncG 20.06.2024 23:00

Вы пробовали использовать import subprocess? См.: запуск bat-файла в Windows с использованием кода Python

Rufus L 20.06.2024 23:09

@RufusL, Да, как уже говорилось в ОП, я попробовал подпроцесс без каких-либо различий (чтобы я мог поэкспериментировать с опцией оболочки).

Bryany 21.06.2024 15:55

Переменная локальной среды PATH определяется по-разному в локальной среде при запуске командного файла вручную из командной строки, открываемой вручную, или при двойном щелчке по пакетному файлу в проводнике Windows по сравнению с локальной средой, в которой интерпретируется сценарий Python. Путь к папке C:\Program Files\Eclipse Adoptium\jdk-21.0.2.13-hotspot\bin указан в переменной пользователя или в переменной системной среды PATH? Как выполняется скрипт Python? Используется ли служба Windows или запланированное задание с другой учетной записью, например СИСТЕМОЙ?

Mofi 22.06.2024 11:21

Пожалуйста, посмотрите В чем причина того, что «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.

Mofi 22.06.2024 11:24

Другое решение — изменить с помощью os.environ локальную переменную среды PATH процесса Python в сценарии Python, чтобы убедиться, что путь к папке C:\Program Files\Eclipse Adoptium\jdk-21.0.2.13-hotspot\bin находится в локальном PATH, прежде чем вызывать subprocess.run() для выполнения cmd.exe для обработки пакетного файла.

Mofi 22.06.2024 11:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
6
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Большое спасибо @Mofi за время, потраченное на диагностику. Это привело меня на правильный путь:

Проблема заключалась в том, что сценарий Python тонко искажал переменную PATH, добавляя к ней элементы с помощью «:» вместо «;». (Изначально код был написан для среды Mac.) Это привело к тому, что первый элемент PATH по умолчанию был объединен с вновь добавленными, и в этом случае первым элементом был путь Java.

Таким образом, хотя на первый взгляд казалось, что печать PATH из Python или .bat включает путь Java, на самом деле его там не было из-за «:». И сценарий, конечно же, работал нормально, если его не запускать из Python.

Другие вопросы по теме