2018-07-27

python, 外部プログラムを認識しない

python のプログラムの1行目に宣言されているコード

#!/usr/bin/python3.5

の バージョンを表す数字を気にすることがない。
通常実行する場合、3.5であろうが3.6でもエラーが出力されない。

しかし、外部プログラムとして呼び出す場合、使用中の python バーションと一致していなければ、次のエラーが出力される。

呼び出されるプログラム名: not found

具体的には

呼び出されるプログラム

▶ abc.py
#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import sys

args = sys.argv 
print ("予選リーグ突破 おめでとう! ")
# args[0]  フルパスのプログラム名
# args[1] プログラム名への文字渡し
print ("えっ 何!  ", args[1])

呼び出す方のプログラム

▶ efg.py
import os
import subprocess

mdir = os.path.abspath(os.path.dirname(__file__)) + "/"
sub_mdir = "lib_a/"
pro_name = "abc.py"

# 外部プログラム呼び出し 戻り値  result 
result = subprocess.run(mdir + sub_mdir 
+ pro_name + "  大迫半端ない", shell=True)
print (result)

# 正常に終了したときの 戻り値
# CompletedProcess(args=('/home/220.../...../
lib_a/abc.py', '大迫半端ない'), returncode=0)
if result.returncode != 0:
# エラー時の処理 returncode が 0 以外
 print ("こらぁ〜 エラーいことになっとるぞ!")

使用のpython バージョンが 3.6 であれば、次のエラーが出力される

/b......: 1 /home/22...../......../lib_a/abc.py: not foundCompletedProcess(args='/home/22...../......../lib_a
/abc.py 大迫半端ない', returncode=127)
こらぁ〜 エラーいことになっとるぞ!

abc.py は見つからない( not found )というエラーが返ってくる。

 #!/usr/bin/python3.6


と書き換えるとことによって、エラーが解消される。

正常に実行されれば

予選リーグ突破 おめでとう! abc.py
えっ 何!   大迫半端ない
CompletedProcess(args='/home/220.../.../lib_a/abc.py 大迫半端ない', returncode=0)


と正常に終了する。