【问题标题】:Pyenv Python versions not working in Linux Shell scriptsPyenv Python 版本在 Linux Shell 脚本中不起作用
【发布时间】:2020-03-22 18:17:20
【问题描述】:

我正在尝试在 Linux (Ubuntu) 上创建 shell 脚本,如 Automate the boring stuff with Python 中所述

我已经创建了所有文件和 Python 脚本,当我尝试在 Ubuntu 中从 Dash 运行它时,它会运行 Python 脚本,而 Python 版本不在我的 pyenv 全局版本中。因此,我无法使用通过 pip 安装的任何其他模块。

我的 Python 版本(与 pyenv 版本一起列出)

  system
* 3.8.1 (set by /home/tomek/.python-version)
  3.8.1/envs/blog_env
  3.8.1/envs/ll_env
  3.8.1/envs/mcam_env
  3.8.1/envs/money_value
  3.8.1/envs/pizzaenv
  3.8.1/envs/project_2
  blog_env
  ll_env
  mcam_env
  money_value
  pizzaenv
  project_2

版本 3.8.1 使用 pyenv 设置为全局。一些细节:

which python && which pip && python -V
/home/tomek/.pyenv/shims/python
/home/tomek/.pyenv/shims/pip
Python 3.8.1

我的 .sh(放在我的主目录中)文件看起来像这样

#!/usr/bin/env bash
python3 /home/tomek/automate/MCAM/mClip.py 'agree'
bash

我的 .desktop 文件(放在 .local/share/applications 需要在 Ubuntu 中通过 Dash 运行脚本)看起来像这样

[Desktop Entry]
Name=mClip
Exec=gnome-terminal -- /home/tomek/mClip.sh
Type=Application
Categories=GTK;GNOME;Utility;

我在 Python 脚本中的第一行如下所示:

#!/usr/bin/env python

所以,当我从 shell 运行我的脚本时,它工作正常,但是当我通过 Dash 运行它时,由于缺少模块,它会出错,所以它试图在不同的 Python 环境中运行它。 我尝试以与尝试运行它相同的方式调试此脚本,因此我以这种方式更改了 .sh 文件

#!/usr/bin/env bash
which python && which pip && python -V && python3 -V
bash

我得到了这个结果

/usr/bin/python
/usr/bin/pip
Python 2.7.17
Python 3.6.9

当我在同一个 shell 窗口中运行这段代码时(!)它给了我

/home/tomek/.pyenv/shims/python
/home/tomek/.pyenv/shims/pip
Python 3.8.1
Python 3.8.1

我也尝试在这个 .sh 脚本中运行 pyenv 以查看结果,但它给了我找不到 pyenv 命令的错误。 我试图到处寻找一些答案,但没有一个对我有用。

【问题讨论】:

    标签: python python-3.x linux bash shell


    【解决方案1】:

    我为自己的问题找到了答案。

    以用户身份安装和配置 pyenv 不会使其适用于从 Ubuntu Dash 运行的 sh 文件。 当您配置 pyenv 时,您会配置 bash 配置文件(如 .bashrc)。

    此配置文件仅在您启动 bash 时加载,而不是在您运行其他程序(例如 sh)时加载(即使通过名称 sh 调用 bash 也不会加载)。并且仅在 bash 交互时才加载。

    你必须像这样直接运行虚拟环境(这是默认的 pyenv 安装位置)。

    例如检查python版本:

    /home/<username>/.pyenv/versions/<environment_name>/bin/python -V
    

    回到我的案例。我的 sh 文件现在看起来像这样:

    #!/usr/bin/env bash
    python -V
    /home/tomek/.pyenv/versions/mcam_env/bin/python -V
    bash
    

    结果是

    Python 2.7.17 #This is default Python version for root
    Python 3.8.1 #This is my pyenv Python version
    

    延伸阅读:

    【讨论】:

      【解决方案2】:

      在您的 Python 脚本中,您的第一行是 #!/usr/bin/env python,所以我认为这会重定向到 /usr/bin/python,这是错误的。你能试试#!/usr/bin/env python3吗?

      【讨论】:

      • 感谢您的回答。通过这种方式,我使用 Python3(实际上是 Python 3.6.9 版本)运行脚本,但它不是我使用 Pyenv 全局安装的 Python 版本。它是 Python 的某个系统版本,没有任何 pip 模块。
      • 那么你的python版本是2.7?
      • 我使用 pyenv 设置的全局 python 版本是 3.8.1,但是当我通过我描述的方法运行脚本时,它是 2.7.17 或 3.6.9。
      猜你喜欢
      • 2023-03-18
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2017-06-21
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多