75294
# 環境

Windows10 Pro 64bit  
Python 3.7  
Git version 2.27.0.windows.1  
VSCode

# プロジェクト

venvで仮想環境をプロジェクトフォルダ内に作成しています。  
メイン開発環境では、python インタプリタ選択で、仮想環境内のpythonを選択されるようにしています。  
このようなプロジェクトをgitで管理しているのですが、リモート環境にgit
cloneを作成した場合、リモート環境下ではあらたに仮想環境を構築しなければなりません。

## 原因個所

venvで作成されたフォルダ内に、以下のファイルがあります。

```

    pyvenv.cfg
    activate
    activate.bat
    Activate.ps1
    
```

これらに絶対パスが記述されていることが、まず問題だと考えています。

## 質問

  1. これらを相対パスの記述にするにはどうすればよいでしょうか？  
そもそも相対パス記述にすれば問題が解決するのでしょうか？

  2. pyvenv.cfgにはAppDataフォルダパスの記述であり、Clone環境下で同じような相対パス（ユーザーごとの）が保証されているわけではないことが問題でしょうか？
  3. 上記1.2では問題がある場合、仮想環境をgit内のvenvフォルダからリモート環境に複製することが可能でしょうか？
CC BY-SA 4.0
2021-04-15T01:04:44.637
75281
2021-04-15T05:47:06.903
2021-04-15T01:17:32.667
3060
32891
question
python python3 git python-venv
venv仮想環境をGit Cloneした環境下でも同じように使用できる方法がありますか？
>   1. これらを相対パスの記述にするにはどうすればよいでしょうか？
>

できません。

>   2.
> pyvenv.cfgにはAppDataフォルダパスの記述であり、Clone環境下で同じような相対パス（ユーザーごとの）が保証されているわけではないことが問題でしょうか？
>

いいえ。

>   3. 上記1.2では問題がある場合、仮想環境をgit内のvenvフォルダからリモート環境に複製することが可能でしょうか？
>

いいえ。

そもそも、venvディレクトリはポータブルではないため、他の人、PC、ディレクトリ、に持ち運べません。  
それぞれで作成する
CC BY-SA 4.0
2021-04-15T05:21:38.573
75293
2021-04-15T05:21:38.573
806
75281
answer
実際に使っているわけではなく少し調べた程度ですので、もしかしたら間違いがあるかもしれません。

* * *

`venv` で管理するのは Python インタプリタ (= Python 自体のバージョン等)
ではなく、あくまでライブラリやモジュール、およびそれらのバージョン情報です。

また、既に確認された通り venv で作成した環境に含まれる pyvenv.cfg
等には環境依存のファイルパスが含まれるので、これらは異なる環境にそのまま共有できるわけではなさそうです。  
(Git でクローンしたら即使えるようになるわけでない)

venv の環境を共有したい場合、venv ディレクトリを直接共有するのではなく、venv 環境にインストールしたパッケージの情報をまとめた
`requirements.txt` を作成し、このファイルを共有する形になりそうです。

**共有元:**

  * venv 関連のファイルを除外する `.gitignore` を用意
  * venv 環境を構築、パッケージをインストール
  * `requirements.txt` を作成
  * Git で共有

**共有先:**

  * venv 環境を構築
  * Git リポジトリからクローンして `requirements.txt` を取得
  * `requirements.txt` を元にパッケージをインストール

* * *

venv 用の .gitignore

**例:**

<https://www.toptal.com/developers/gitignore/api/venv>

```

    # Created by https://www.toptal.com/developers/gitignore/api/venv
    # Edit at https://www.toptal.com/developers/gitignore?templates=venv
    
    ### venv ###
    # Virtualenv
    # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
    .Python
    [Bb]in
    [Ii]nclude
    [Ll]ib
    [Ll]ib64
    [Ll]ocal
    [Ss]cripts
    pyvenv.cfg
    .venv
    pip-selfcheck.json
    
    # End of https://www.toptal.com/developers/gitignore/api/venv
    
```

パッケージ一覧から `requirements.txt` を作成

```

    pip freeze > requirements.txt
    
```

`requirements.txt` を元にパッケージをインストール

```

    pip install -r requirements.txt
    
```

**参考:**

[PyCharmでVenvをGitで共有するときにすること](https://hiropon-progra.com/?p=82)  
[virtualenvをgitで管理すると便利 -
Qiita](https://qiita.com/m-masaki72/items/7ba34e31d9f08662f1ee)  
[python3のvenvでプロジェクト毎にライブラリを管理する](https://akogare-
se.hatenablog.com/entry/2019/01/02/220330)
CC BY-SA 4.0
2021-04-15T05:22:01.960
75294
2021-04-15T05:22:01.960
3060
75281
answer
先のお二方の回答の方が正しいと思われますが、そこを敢えて何かするとしたら。

バッチファイルやスクリプトファイルならば、そのファイル自身が何処に移動しても、その時点での絶対パスを取得する方法があり、親フォルダーのパスを取得することもできます。

バッチファイル  
[How to get windows batch's parent
folder](https://stackoverflow.com/q/16623780/9014308)  
[こちらの答えの方です](https://stackoverflow.com/a/60046276/9014308)

>
```

>     for %%I in ("%~dp0.") do for %%J in ("%%~dpI.") do set
> ParentFolderName=%%~dpnxJ
>     echo %ParentFolderName%
>  
```

バッチファイルの中に以下の行があるので：

>
```

>     set VIRTUAL_ENV=C:¥仮想環境パス
>  
```

それをこちらに変更すれば良いでしょう。

>
```

>     for %%I in ("%~dp0.") do for %%J in ("%%~dpI.") do set
> VIRTUAL_ENV=%%~dpnxJ
>  
```

* * *

PowerShellスクリプト  
[PowerShell で親フォルダーの「フォルダー名」を取得する](https://mseeeen.msen.jp/extract-parent-
folder-name-in-powershell/)

> 親フォルダーのパスを取得する
```

>     $parentDir = Split-Path $commandPath -Parent
>     Write-Output $parentDir
>  
```

PowerShellスクリプトの方は、何を変えれば良いのか分かりませんが、実は変えなくても外から指定できるのかもしれません。  
スクリプトの中に以下のようなコメント記述があります。

>
```

>     .Example
>     Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
>     Activates the Python virtual environment located in the specified
> location.
>  
```

* * *

シェルスクリプト  
[シェルで実行スクリプトの親ディレクトリへ確実に移動する（bash/zsh/ash パレント
・ディレクトリの取得とスペース入りのパスの場合）](https://qiita.com/KEINOS/items/bfd16189894c4bdace8e)

> スクリプトのパレント（親）ディレクトリの絶対パス取得（スペース入り対応）
```

>     PATH_DIR_PARENT="$(dirname "$(cd "$(dirname "${BASH_SOURCE:-$0}")" &&
> pwd)")"
>     echo "$PATH_DIR_PARENT"
>  
```

シェルスクリプトの中に以下の行があるので：

>
```

>     VIRTUAL_ENV=仮想環境パス
>  
```

それをこちらに変更すれば良いでしょう。

>
```

>     VIRTUAL_ENV="$(dirname "$(cd "$(dirname "${BASH_SOURCE:-$0}")" &&
> pwd)")"
>  
```

* * *

`pyvenv.cfg`については、以下のような説明になっているので、`PYTHONHOME`という環境変数を設定しておけば無視されるのでは？  
あるいはClone後プロジェクトの環境設定スクリプトを別途作っておいて、その中で`pyvenv.cfg`の`home`を設定してみるとか。

[venv --- 仮想環境の作成](https://docs.python.org/ja/3/library/venv.html)

> 仮想環境 を作成するには venv コマンドを実行します:
```

>     python3 -m venv /path/to/new/virtual/environment
>  
```

>
> このコマンドを実行すると、ターゲットディレクトリ (および必要なだけの親ディレクトリ)
> が作成され、その中に`pyvenv.cfg`ファイルが置かれます。 そのファイルの`home`キーはこのコマンドを呼び出した Python
> のインストール場所を指します (よく使われるターゲットディレクトリの名前は`.venv`です)。

[3.9. モジュールの検索](https://docs.python.org/ja/3/using/windows.html#finding-
modules)

> メインの実行ファイルと同じ場所か一つ上のディレクトリに`pyvenv.cfg`がある場合、以下の異なった規則が適用されます:
>
>   * [PYTHONHOME](https://docs.python.org/ja/3/using/cmdline.html#envvar-
> PYTHONHOME) が設定されておらず、`home`が絶対パスの場合、home
> 推定の際メインの実行ファイルから推定するのではなくこのパスを使います。
>
CC BY-SA 4.0
2021-04-15T05:47:06.903
75297
2021-04-15T05:47:06.903
26370
75281
answer