必须更改哪些特定语法或配置才能使 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
解析为,最佳实践是显式指定。python3
PATH
python3
请参阅以下相关讨论:RHEL 8 中的 Python