将少量 python 嵌入到批处理脚本中

Embedding small amounts of python into batch scripts

我有一个主要用 python 编写的应用程序。我希望制作并使用包含所有必需包的虚拟环境。在 Linux 中,这很容易。 这是我的 shell 脚本来设置虚拟环境

#!/bin/bash
#It is best practice to create virtual environments for projects that require many packages installed
python3 -m venv ./python_environment  #Creates a new virtual environmnet in PWD
source ./python_environment/bin/activate  #swithces to our new virtual environment

#Now we can install the needed packages using pip
python3 -m pip install --upgrade pip
pip install numpy opencv-python pillow imutils

这是我启动应用程序的脚本

#!/bin/bash
#This is a wrapper that launches program
source ./python_environment/bin/activate   # Uses custom python envionment in PWD
PYWRAP=$(cat <<EOF
import tagging
import tagging.tagger_controller
tagging.tagger_controller.start()
EOF
)#BASH Variable to pass to python

python3 -c "$PYWRAP"  #Executes the python wrapper

当我尝试为 Windows 执行此操作时,脚本并不那么优雅。 setup.bat 运行,但我注意到有些包没有安装

python -m venv python_environment
python_environment\Scripts\activate.bat
python -m pip install --upgrade pip
pip install numpy opencv-python pillow imutils

launcher.bat 只激活环境,不启动应用程序。 您可能还注意到此脚本调用了一个 .py 文件,这不太理想,但我不 知道如何将几行 python 嵌入到批处理文件中,就像我在 Linux.

中所做的那样
python_environment\Scripts\activate.bat
python main.py

请告诉我你的想法...

这不是一个完整的答案,但我想向您展示如何将 Python 嵌入到 Windows 批处理文件中。请注意,这不是原创的——我在将近 20 年前(2003 年)在互联网上的某个地方找到了它。

@echo off
rem = """
rem Do any custom setup like setting environment variables etc if required here ...

python -x "%~f0" %*
goto endofPython """

# Your python code goes here ..

if __name__ == "__main__":
    print("Hello World from Python")

rem = """
:endofPython """

我的解决方案是以上两个答案的组合。

@echo off
rem = """
rem Do any custom setup like setting environment variables etc if required here ...

call python_environment\Scripts\activate.bat

call python -x "%~f0" %*
goto endofPython """

# Your python code goes here ..

import tagging
import tagging.tagger_controller
tagging.tagger_controller.start()

rem = """
:endofPython """

您会注意到这与@martineau 发布的解决方案非常相似 然而,一个关键的区别是 call 命令用于第 5 和第 7 行 (感谢@aschipfl 的洞察力)。这使得批处理脚本可以调用 python 代码,而不是在调用后立即关闭应用程序。

感谢您的帮助,祝您好运!!!
KopiousKarp