【问题标题】:Python script in systemd: virtual environment or real environmentsystemd 中的 Python 脚本:虚拟环境或真实环境
【发布时间】:2020-03-31 20:12:36
【问题描述】:

我一直在尝试在启动时(在 Pi 上)运行 python 脚本。我最初是通过 cron 触发的 .sh 脚本执行此操作的。

在 StackExchange Pi (https://raspberrypi.stackexchange.com/questions/110868/parts-of-code-not-running-when-autostarting-script-in-crontab) 上发布问题,建议使用 systemd。

在那里帮助我的人建议在执行 Python 脚本时不要使用虚拟环境(他们注意到他们对 Python 的熟悉程度有限),而是使用真实环境。但其他资源强烈建议使用虚拟环境(例如https://docs.python.org/3/tutorial/venv.html)。

如果希望正确设置,任何人都可以权衡正确的方法吗?

【问题讨论】:

标签: python virtualenv systemd


【解决方案1】:

使用虚拟环境。我看不出有什么理由不这样做。在某些时候,您可能希望在该系统上同时运行多个 Python 应用程序,这些应用程序可能需要相同依赖项的不同版本,然后您将回到原点,所以...使用虚拟环境。

在配置 systemdcrontab 或其他任何内容时,请确保使用位于虚拟环境的 bin 目录中的 python 二进制文件,以便不需要激活虚拟环境:

/path/to/venv/bin/python -m my_executable_module
/path/to/venv/bin/python /path/to/my_script.py
/path/to/venv/bin/my_executable_script

【讨论】:

    【解决方案2】:

    systemd 将尝试在启动时运行您的脚本,因此您的虚拟环境还没有被激活。您可以(也许)通过告诉 systemd 使用 virtualenv 的 bin 中的 python 和适当的环境变量来避免这个问题。或者,您可以将 activate 作为该脚本在 systemd 中启动的预运行步骤。也许吧。

    但总的来说,我会让 systemd 和您的操作系统变得容易,而忽略 virtualenv 绝对主义者。让脚本在你的开发机器上运行,使用你想要的 virtualenv,然后准备 systemd 以使用全局 python,并安装合适的包。对于不必使用 systemd 的脚本,您始终可以在该 pi 上使用 virtualenvs。 Systemd 并不总是有最清晰的错误消息。

    (如果您需要导入自定义模块,您可以在脚本中将目录注入sys.path。这甚至可以完全避免安装包,对于全局 Python。)

    这个答案肯定是基于意见的。

    【讨论】:

      最近更新 更多