Я сделал скрипт (названный isPA64.bat), чтобы определить, является ли работающая система 64-битной (на основе этого Bear's Log совет):
@echo off
setlocal
set str1=%PROCESSOR_ARCHITECTURE%
set/A sixty4=0
if not x%str1:64=%==x%str1% set/A sixty4=1
endlocal & exit/B %sixty4%
Он вызывается из другого простого пакета с именем callpa.bat (его можно было бы вызвать и напрямую, но это доказывает, что ERRORLEVEL действительно устанавливается соответствующим образом):
@echo off
ver>nul & (call isPA64.bat & if ERRORLEVEL 1 (echo 64-bit & exit/B 1) else (echo not 64-bit & exit/B 0))
До этого момента все это работало нормально; однако я должен вызвать один из этих двух из программы Python 3.7.2. Я делаю это:
import subprocess
print(subprocess.run(["callpa.bat"]))
Достаточно просто, не так ли? Но я не смог понять, как вернуть правильный код возврата в коде Python... Есть ли способ назначить переменную в коде Python либо коду «выход»/возврата, либо коду значение ERRORLEVEL из оболочки cmd.exe, которая выполняет сценарий внешнего уровня? ... Я не могу найти способ сделать это в документации по python.
print(subprocess.run(["callpa.bat"]))
не показывает вам правильный код возврата или что он показывает, и вы просто не знаете, как получить его программно? - person Joseph Sible-Reinstate Monica   schedule 02.01.2020callpa.bat
, нет необходимости вisPA64
:@If %PROCESSOR_ARCHITECTURE:~-2% Equ 86 (If Defined PROCESSOR_ARCHITEW6432 (Exit /B 0)Else Exit /B 1)Else Exit /B 0
. Вы также заметите, что я использовал более надежный код, так как 64-битная система, работающая под управлением 32-битного процесса, будет неправильно возвращать x86 без дополнительной проверки. - person Compo   schedule 02.01.2020import
ingos
и чтенияos.environ['PROCESSOR_ARCHITECTURE']
иos.environ['PROCESSOR_ARCHITEW6432']
работает на вас. - person Compo   schedule 02.01.2020PROCESSOR_ARCHITECTURE
зависит от 64-разрядной версии Windows, если к ней обращается 32-разрядное или 64-разрядное приложение. Значение переменной среды равноx86
, а неAMD64
, как вы, скорее всего, ожидаете, если скрипт Python интерпретируется 32-разряднымpython.exe
, работающим в 64-разрядной Windows. См. статью Microsoft о Подробности реализации WOW64 . Лучше проверить, определена ли вообще переменная средыProgramFiles(x86)
, что имеет место только в 64-битной Windows. - person Mofi   schedule 02.01.2020%SystemRoot%\Sysnative\cmd.exe
, гдеSystemRoot
также является предопределенной переменной среды, которая содержит путь к каталогу Windows.%SystemRoot%\Sysnative\cmd.exe
существует только для 32-битных процессов, работающих в 64-битной Windows, см. статью Microsoft о Перенаправитель файловой системы. Нет необходимости в пакетном файле, чтобы узнать все это из скрипта Python. - person Mofi   schedule 02.01.2020print(subprocess.run(["callpa.bat"]))
всегда возвращает 0, даже когда я ожидаю 1. Я интерпретирую результат значение этой функции python неправильно? Нужно ли искать в другом месте, например, в каком-то объекте CalledProcessError? ... Или (маловероятно?) Есть ли ошибка в коде возвращаемого значения функций python subprocess.run() и/или subprocess.call()? - person Rob F.   schedule 03.01.2020ProgramFiles(x86)
, является гораздо лучшим способом добиться того, чего я хочу. Он работает на моей 32-битной машине с пакетом xp; он работает на моей 64-битной машине под управлением Win 8.1 с установленным 32-битным python (и, конечно, проверка исходного пакетного файла запускается и работает нормально). Вот моя новая партия isPFx86defined.bat:@if defined ProgramFiles(x86) (echo Programfiles^(x86^) is defined & exit/B 1) else (echo undefined & exit/B 0)
Считаю это полным и адекватным решением. - person Rob F.   schedule 03.01.2020