0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AutomatorでPython3を使う時にハマるポイント

Last updated at Posted at 2020-11-26

##はじめに
Automatorを使用してPython3を動作しようとしている方がハマりやすいエラーを解説していきます。閲覧しているあなた様の助けになることをお祈りしております。ご質問等も歓迎です。

##初学者が必ずハマるエラーを紹介する
何も知識がないままAutomator開いていつものbashだと思い脳死状態でこう書きがちです。
スクリーンショット 2020-11-26 10.44.23.png
しかしながらこれでは実行できません。以下のエラーが発生します。
アクション“シェルスクリプトを実行”でエラーが起きました: “-: python3.9: command not found”
-: python3.9: command not found
スクリーンショット 2020-11-26 10.44.31.png
##原因
そもそもPythonのパスが.bash_profileにしか書いておらずAutomatorにあるbashは標準で/usr/binにあるコマンド以外を認識できないため。
##解決策
お好きな方をどうぞ。
####1.bash_profileを最初に読み込ませる
source ~/.bash_profile
スクリーンショット 2020-11-26 11.37.05.png
####2.pythonの絶対パスを指定する
which python3で何処にPythonがあるのか分かるのでそのパスをC/Pして貼りましょう。
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
スクリーンショット 2020-11-26 12.17.35.png

##ニッチな人がハマるエラー
自分の運用しているdiscord.pyを使用したbotではsubprocessモジュールを使用しているのですがsource ~/.bash_profileを忘れてしまい一部の機能が動かなくなると言う事例がありました。私の実際のコードを引用して解説します。

subprocess_test.py
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)

example-a.py(discord.py公式ドキュメントから大半を引用)
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')
example-b.py
aとほぼ同じなので省略します

subprocess_test.pyを見てもらえると理解してもらえると思いますがpythonの絶対パスを指定せずにPopenしているので解決としては絶対パスで書くと適切に動きます。なぜか以前の環境では絶対パス無しで動作していました。なぜでしょう。

##終わりに
そもそもAutomatorでBotを動かすな
以上です。閲覧ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?