Как вставить код 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')