##はじめに
Automatorを使用してPython3を動作しようとしている方がハマりやすいエラーを解説していきます。閲覧しているあなた様の助けになることをお祈りしております。ご質問等も歓迎です。
##初学者が必ずハマるエラーを紹介する
何も知識がないままAutomator開いていつものbashだと思い脳死状態でこう書きがちです。
しかしながらこれでは実行できません。以下のエラーが発生します。
アクション“シェルスクリプトを実行”でエラーが起きました: “-: python3.9: command not found”
-: python3.9: command not found
##原因
そもそもPythonのパスが.bash_profile
にしか書いておらずAutomatorにあるbashは標準で/usr/binにあるコマンド以外を認識できないため。
##解決策
お好きな方をどうぞ。
####1.bash_profileを最初に読み込ませる
source ~/.bash_profile
####2.pythonの絶対パスを指定する
which python3
で何処にPythonがあるのか分かるのでそのパスをC/Pして貼りましょう。
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
##ニッチな人がハマるエラー
自分の運用しているdiscord.pyを使用したbotではsubprocessモジュールを使用しているのですがsource ~/.bash_profile
を忘れてしまい一部の機能が動かなくなると言う事例がありました。私の実際のコードを引用して解説します。
import subprocess
import discord
import key
TOKEN = key.TOKEN
client = discord.Client()
@client.event
async def on_ready():
print('WakeUp...')
subprocess.Popen(["sudo","/Library/Frameworks/Python.framework/Versions/3.7/bin/python3","example-a.py"])
subprocess.Popen(["sudo","/Library/Frameworks/Python.framework/Versions/3.7/bin/python3","example-b.py"])
@client.event
async def on_message(message):
if 'morning' in message.content:
channel = client.get_channel(message.channel)
subprocess.Popen(["python3","example-a.py"]
await message.channel.send("<@0000000000000000000>"+"を起動しました")
if 'evening' in message.content:
channel = client.get_channel(message.channel)
subprocess.Popen(["python3","example-b.py"])
await message.channel.send("<@000000000000000001>"+"を起動しました")
client.run(TOKEN)
import discord
client = discord.Client()
@client.event
async def on_ready():
print("login!")
@client.event
async def on_message(message):
if message.author.bot == True:
return
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
client.run('your token here')
aとほぼ同じなので省略します
subprocess_test.pyを見てもらえると理解してもらえると思いますがpythonの絶対パスを指定せずにPopenしているので解決としては絶対パスで書くと適切に動きます。なぜか以前の環境では絶対パス無しで動作していました。なぜでしょう。
##終わりに
そもそもAutomatorでBotを動かすな
以上です。閲覧ありがとうございました。