RHEL8仮想マシンが次の単純なPythonプログラムを正常に実行できるようにするには、どの特定の構文または設定を変更する必要がありますか?
問題の定義:
単純なPython 3プログラムは、サブプロセスモジュールを使用して別の単純なPython 3プログラムを呼び出します。 Windowsで実行すると予想される出力が表示されますが、RHEL 8で実行すると次のエラーが表示されます。
b'/bin/sh: python: command not found\n'
2つの簡単な手順:
その内容は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結果:
これら2つの簡単なプログラムは、以下のように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'
しかし、2番目のプログラムは、次のように端末から直接呼び出すとうまく動作します。
[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
したがって、問題は、サブプロセスモジュールがrhel8で実行されたときにPythonがPythonを認識しないようです。
答え1
対話型bashシェルでエイリアスを介してpython
解決します。python3
エイリアスは継承されないため、/bin/sh
子プロセスではこれを確認できません。でもできるシェル継承を介して解決するためのシンボリックリンクを作成しますpython
。最善の方法はこれを明示的に指定することです。python3
PATH
python3
以下の関連ディスカッションをご覧ください。RHEL 8のPython