46891


pipenvでのアプリケーションのビルド・実行は、プロジェクトのルートディレクトリで

[code]

    pipenv install
    pipenv run python main.py
    
[/code]

のようにすると思うのですが、このアプリケーションを任意のディレクトリから実行する方法が見つけられずにいます。

**試したこと**  
**1. スクリプトのパスを指定**  
例えば

[code]

    pipenv run python /path/to/main.py
    
[/code]

のようにすると、カレントディレクトリに対して仮想環境の構築が始まってしまいます。

**2. pipenv shell**  
`pipenv shell`で仮想環境を起動すれば`python
/path/to/main.py`で実行できますが、毎回仮想環境を起動しなければならず、複数のアプリケーションを使うのにいちいち仮想環境を切り替えなければならない(?)のが手間です。

理想的には、プロジェクトのルートで仮想環境を構築し、その仮想環境のもとでのアプリケーション実行を任意のディレクトリから行いたいのですが、そのようなことは可能でしょうか？


CC BY-SA 4.0
2018-07-22T14:32:37.360
46841
2018-07-24T12:30:57.180
13199
question
python
pipenvで任意のディレクトリからアプリケーションを実行したい


本家に関連しそうな質問がありました。  
ただ、解決とはなってないようです。

[How to run a cron job with
pipenv?](https://stackoverflow.com/questions/48990067/how-to-run-a-cron-job-
with-pipenv?answertab=active#tab-top)

そこでは、ラッパーシェルスクリプトを用意する方式が提案されていました。  
ラッパーシェルスクリプトの中で、  
ディレクトリの移動と、`pipenv run`を実行するというものです。

この方式なら実現できると思います。


CC BY-SA 4.0
2018-07-22T20:33:36.100
46845
2018-07-22T20:33:36.100
46841
answer


`pipenv`は、`npm`を意識して作られていて、Webアプリケーションを作成する場合には非常に便利です。

一方で、データサイエンスの場合のように任意のディレクトリからアプリケーションを実行したい場合にはデフォルトの設定では向いていません。その場合には、`export
PIPENV_VENV_IN_PROJECT=true`として、環境変数`PIPENV_VENV_IN_PROJECT`に`true`に設定すると、仮想環境`.venv`がそのディレクトリの下に作られるようになります。そうすると、`virtualenv(venv)`で仮想環境を作った場合と同じように、どこの場所からでも仮想環境を起動できるようになります。

[code]

    source path_to_dir/.venv/bin/activate
    
[/code]

デフォルトの設定の場合と`pipenv`の使い方は変わらず、ルートディレクトリ以外でルートディレクトリに戻って仮想環境を起動する必要がなくなるので少しは便利になります。

また、ディレクトリ間の移動が多く仮想環境を変更することが少ないデータサイエンスのような場合は、`pipenv`よりも`conda`を使った方が便利なように思います。


CC BY-SA 4.0
2018-07-23T01:21:52.073
46850
2018-07-23T02:41:41.657
2018-07-23T02:41:41.657
15171
15171
46841
answer


`PIPENV_PIPFILE`環境変数を使って、所望の結果を得られそうです。

例えば、Pipfileのあるディレクトリで`pip
install`して、必要パッケージのインストールと仮想環境の構築が完了しているとして、他のディレクトリにおいて

[code]

    export PIPENV_PIPFILE=/path/to/Pipfile
    pipenv run python /path/to/main.py $*
    
[/code]

とすると、構築済みの仮想環境を使ってアプリケーションが実行されます。

こうなるのは仮想環境が（カレントディレクトリに対してではなく）Pipfileのパスに対して作られるためのようです。残念ながら、この振る舞いについて明記されたドキュメントは見つけられませんでした。以下に[ソースコード](https://github.com/pypa/pipenv/blob/02fc52b8da7dc76d429504864704d59ea29426fb/pipenv/project.py)の該当箇所を抜粋します。

[code]

    @property
    def name(self):
        if self._name is None:
            self._name = self.pipfile_location.split(os.sep)[-2]
        return self._name
    
[/code]

[code]

    @property
    def virtualenv_name(self):
        sanitized, encoded_hash = self._get_virtualenv_hash(self.name)
        suffix = "-{0}".format(PIPENV_PYTHON) if PIPENV_PYTHON else ""
        # If the pipfile was located at '/home/user/MY_PROJECT/Pipfile',
        # the name of its virtualenv will be 'my-project-wyUfYPqE'
        return sanitized + "-" + encoded_hash + suffix
    
[/code]


CC BY-SA 4.0
2018-07-24T04:26:35.137
46891
2018-07-24T12:30:57.180
2018-07-24T12:30:57.180
13199
13199
46841
answer