面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

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は独特すぎて学習するのも面倒なので、必要ない限りは今回のようなやり方でいいかなと思ってる。