Как вставить код python в пакетном режиме script
В bash мы можем:
python - << EOF
import os
print 'hello'
EOF
чтобы вставить фрагмент кода python в bash script.
Но в пакете Windows это не работает, хотя я все еще могу использовать python -c, но для этого мне нужно скомбинировать мой код в одну строку, чего я стараюсь избежать.
Есть ли способ достичь этого в пакете script?
Спасибо.
Ответы
Ответ 1
Вы можете использовать гибридную технику.
1>2# : ^
'''
@echo off
echo normal
echo batch code
echo Switch to python
python "%~f0"
exit /b
rem ^
'''
print "This is Python code"
Код партии находится в многострочной строке '''
, поэтому это невидимо для python.
Парсинг-парсер не видит код python, поскольку он выходит раньше.
Первая строка - это ключ.
Он действителен для партии, а также для python!
В python это только бессмысленное сравнение 1>2
без вывода, остальная часть строки является комментарием #
.
Для пакета 1>2#
это перенаправление потока 1
в файл 2#
.
Команда представляет собой двоеточие :
, это означает, что метка и помеченные строки никогда не печатаются.
Затем последний карет просто добавляет следующую строку к строке метки, поэтому пакет не видит строку '''
.
Ответ 2
Еще более эффективный, плюс он передает все аргументы командной строки и возвращает код выхода из script:
@SETLOCAL ENABLEDELAYEDEXPANSION & python -x "%~f0" %* & EXIT /B !ERRORLEVEL!
# Your python code goes here...
Здесь происходит разбивка того, что происходит:
-
@
предотвращает печать строки script
-
SETLOCAL ENABLEDELAYEDEXPANSION
позволяет! ERRORLEVEL! для оценки после запуска python script
-
&
позволяет запускать другую команду в той же строке (аналогично UNIX ;
)
-
python
запускает интерпретатор python (должен находиться в% PATH%)
-
-x
сообщает python игнорировать первую строку (запустите python -h для получения дополнительной информации)
-
"%~f0"
расширяется до полностью определенного пути исполняемой партии script (Аргумент% 0). Он цитируется в случае, если путь содержит пробелы
-
%*
расширяет все аргументы, переданные в script, эффективно передавая их на python script
-
EXIT /B
говорит, что пакет Windows Batch должен выйти из текущего пакетного файла (только с помощью EXIT
приведет к выходу вызывающего интерпретатора)
-
!ERRORLEVEL!
расширяется до кода возврата из предыдущей команды после ее запуска. Используется в качестве аргумента для EXIT /B
, это приводит к выходу пакета script с кодом возврата, полученным от интерпретатора python
ПРИМЕЧАНИЕ. Возможно, вам придется изменить "python" на что-то еще, если ваш двоичный код python не находится в PATH или находится в нестандартном расположении. Например:
@"C:\Path\To\Python.exe" -x ...
Ответ 3
Откажитесь от идеи, что вам нужно сразу указать python script в пакетном файле. Поместите код python в отдельный файл, а затем просто запустите отдельный файл под python из командного файла Windows.
Ответ 4
Единственный способ, которым я это знаю, - вызвать Python script из командного файла следующим образом:
@echo off
REM whatever other code
python python_script.py
REM rest of batch file...
Ответ 5
@echo off
setlocal EnableDelayedExpansion
set "fTmpPy=%TEMP%\~fTmp.py"
call :getLine "::python_beg" "::python_end" > "!fTmpPy!"
python "!fTmpPy!"
pause
exit /b 0
:getLine <beg str> <end str>
set "bBegEnd=0"
for /f "usebackq delims=" %%l in ("%~f0") do (
if !bBegEnd! equ 1 (
if "%%l" equ "%~2" ( exit /b 0 )
setlocal DisableDelayedExpansion
echo %%l
endlocal
) else (
if "%%l" equ "%~1" ( set "bBegEnd=1" )
)
)
exit /b 0
endlocal
::mark is unique - one character or string
::begin mark must be
::end mark is optional if it is on eof
::python_beg
print( 'Hello, world!' )
::python_end
Возможно включение любого символа или строки, но только вещь '!' восклицание является исключением.
'!' используется для переменной, поэтому вам нужно установить "DisableDelayedExpansion". В конце вы должны установить "endlocal". Это все.
Вы можете использовать эту процедуру для любого script или любого документа. Хотя cmd script...
Ответ 6
Для простой команды: приглашение Windows cmd понимает только двойные кавычки, поэтому вы можете утроить их, чтобы они работали с -c
:
python -c print("""Hi""")
или используйте простые кавычки, которые вообще не интерпретируются Windows cmd:
python -c print('Hi')