43410


condaで作った仮想環境下で`forego run python
**.py`で実行すると、仮想環境にinstallしたModuleがImportErrorになってしまいます。調べても出てこず、困っています。

[code]

    import os
    import MeCab #あくまで例示、MeCab以外でもエラーになる。
    
[/code]

実行結果

[code]

    ImportError: No module named MeCab
    ERROR: exit status 1
    
[/code]

環境は以下の通りです。  
OS :Ubuntu 14.04.5 LTS  
python:3.6.4  
conda :4.3.34  
forego:Version 20180217041714

~~コードの全体は以下のとおりです。foregoを使う目的はAPIのアクセストークン等を.envファイルから読み込むことです。「pythonクローリング&スクレイピング」にかかれていた方法です。  

[code]

    import os
    from requests_oauthlib import OAuth1Session #ここがエラー
    
    # 環境変数から認証情報を取得する。
    CONSUMER_KEY = os.environ['CONSUMER_KEY']
    CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
    ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
    ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']
    
    # 認証情報を使ってOAuth1Sessionオブジェクトを得る。
    twitter = OAuth1Session(CONSUMER_KEY,
                            client_secret=CONSUMER_SECRET,
                            resource_owner_key=ACCESS_TOKEN,
                            resource_owner_secret=ACCESS_TOKEN_SECRET)
    
    # ユーザーのタイムラインを取得する。
    response = twitter.get('https://api.twitter.com/1.1/statuses/home_timeline.json')
    
    # APIのレスポンスはJSON形式の文字列なので、response.json()でパースしてlistを取得できる。
    # statusはツイート（Twitter APIではStatusと呼ばれる）を表すdict。
    for status in response.json():
        print('@' + status['user']['screen_name'], status['text'])  # ユーザー名とツイートを表示する。
    
[/code]


CC BY-SA 3.0
2018-04-19T14:15:19.590
43396
2018-04-20T01:32:49.990
2018-04-20T01:32:49.990
28240
28240
question
python anaconda conda foreman
foregoを使うと、condaで作った仮想環境を無視する？


forego
の[コード](https://github.com/ddollar/forego/blob/4bb213294ff63ed4fc2f095d57e425d9ca18a42b/run.go#L40)によると、`forego
run` はインタラクティブなシェル上でコマンドを実行します ([issue
#9](https://github.com/ddollar/forego/issues/9)
を解決するためのようです)。しかしこの設定のためコマンド実行前に `~/.bashrc` などが呼び出され、`source activate 〇〇`
の際に指定された `$PATH` などを上書きしてしまいます。したがって conda で指定した仮想環境が無視されてしまい、ImportError
に繋がっています。この動作は [issue #14](https://github.com/ddollar/forego/issues/14)
で議論されていますが、想定された挙動のようです。

これをどう解決するかは、なぜ forego の上で Python スクリプトを走らせたいかによりそうです。たとえば「activate して python
スクリプトを動かす」ようなシェルスクリプトを作ってそれを `forego run` すると一応動かせますが、環境変数を上書きしているため用途によっては
forego を使う意味が無いかもしれません。

[code]

    #!/bin/sh
    
    source deactivate
    source activate ○○○
    python ○○.py
    
[/code]


CC BY-SA 3.0
2018-04-19T19:41:24.577
43410
2018-04-19T19:41:24.577
19110
43396
answer