python 在 rhel8 中找不到 python

python 在 rhel8 中找不到 python

必须更改哪些特定语法或配置才能使 RHEL8 虚拟机成功运行下面的简单 python 程序?

问题定义:

一个简单的 python 3 程序使用 subprocess 模块来调用另一个简单的 python 3 程序。在 Windows 中运行时,会出现预期的输出结果,但在 RHEL 8 中运行时,会出现以下错误:

b'/bin/sh: python: command not found\n'

两个简单的程序:

其内容command_test.py为:

import subprocess

def runShellCommand(commandToRun):
  proc = subprocess.Popen( commandToRun,cwd=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
  while True:
    line = proc.stdout.readline()
    if line:
      print(line)
    else:
      break

myCmd = "python call_me.py"
runShellCommand(myCmd)

其内容call_me.py为:

print("If you see this, then I was called correctly.")

成功的 WINDOWS 结果:

当在 Windows 中运行时,这两个简单的程序给出了预期的结果,如下所示:

C:\path\to\somedir>python command_test.py
b'If you see this, then I was called correctly.\r\n'

Linux 错误结果:

在RHEL8虚拟机中运行时,会出现以下错误输出:

[user@someVMSS000001 somedir]$ python command_test.py
b'/bin/sh: python: command not found\n'

但是,当我们直接从终端调用第二个程序时,第二个程序运行良好,如下所示:

[user@someVMSS000001 somedir]$ python call_me.py
If you see this, then I was called correctly.

当我们从终端检查 python 是否已安装时,我们还可以确认 python 确实已安装并且可见,如下所示:

[user@someVMSS000001 somedir]$ python --version
Python 3.8.12

云初始化 Python 安装代码:

配置 VM 的 cloud-init 文件中的以下几行定义了导致上述问题的 python 配置:

dnf install python3.8 -y
dnf remove python3.6 -y
rm -rf /usr/bin/python3
mv /usr/bin/python3.8 /usr/bin/python3

python3 --version

dnf install -y python3-setuptools
dnf install python3-pip -y

python3 -m pip install pyyaml
python3 -m pip install requests
python3 -m pip install awscli

#Set alias so python commands use python3
echo "alias python=python3" >> /etc/bashrc

dnf clean all
dnf update python3 -y

python3 --version

所以问题似乎是当subprocess模块​​在rhel8中运行时,python看不到python。

答案1

在交互式 bash shell 中,通过别名python解析。python3

别名不是继承的,因此/bin/sh子进程无法解析它。虽然你可以创建一个符号链接,以便通过 shell 的继承python解析为,最佳实践是显式指定。python3PATHpython3

请参阅以下相关讨论:RHEL 8 中的 Python

相关内容