Apple Scriptで"scrapy crawl hoge"をshellで実行しようとして躓いた話
Terminalでは上手くいくのに、AppleScriptではエラー
Terminalを起動して、 do shell script "scrapy crawl hoge"
を打つと問題なく動作するのに、Apple Scriptで do shell script "scrapy crawl hoge"
のようにshellを実行しようとしたところ、 sh: scrapy: command not found
とエラーが出てしまった。
PATHを通しているからTerminalでは正常に動いてるみたいだし、AppleScriptではPATHとか考慮されないぽい?
commandがなきゃ大本を見つけて叩く
scrapyが見つからないなら、直接commandを叩いてやろうと which scrapy
でpathを調べ /Library/Frameworks/Python.framework/Versions/2.7/bin/scrapy
だと判明する。
で、
do shell script "/Library/Frameworks/Python.framework/Versions/2.7/bin/scrapy crawl hoge"
を実行するのだけれど、別のエラーが出てきた。
Scrapy 1.4.0 - no active project Unknown command: crawl Use "scrapy" to see available commands
大きな勘違いをしていた
scrapyは見つかったけど、今度はその引数が上手く渡せていないのか?と思って、引数の渡し方を必死に調べていた。 実際は、有効なspider nameが見つからない時のエラーが出ていたわけなのだが…。
Terminalでcommandを打っている時は、現在のpathを基点に打つので無意識的にApple Scriptも出力したファイルを実行するpathを基点に動いていると勘違いをしていた。
そこで、検証として下記のように順にshellを実行したところ…
-- "--"は、Apple Scriptでコメント log (do shell script "pwd") -- "/" log (do shell script "cd /Users; pwd") -- "/Users" log (do shell script "pwd") -- "/"
shellの実行は必ずrootを基点として始まってて、 do shell script ""
1行毎にrootを基点とすることが判明…。
なので、scrapy project内で scrapy crawl hoge
を実行しないといけないのに、ずっとrootで実行しようとしていたわけだ。そりゃエラーにもなる。
思い込み怖い
最終的に do shell script "cd /Users/(Scrapy Project Path)/; /Library/Frameworks/Python.framework/Versions/2.7/bin/scrapy crawl hoge"
のように1行でpath移動とscrapyのcommandを書くことで正常にshell scriptが動くApple Scriptを作成できた。
もっと綺麗なやりかたもあるのかもしれないが、Apple Scriptは独特すぎて学習するのも面倒なので、必要ない限りは今回のようなやり方でいいかなと思ってる。