virtualenvのカスタムコードはどこにありますか?


107

使用する場合、どのようなディレクトリ構造に従う必要がありvirtualenvますか?たとえば、WSGIアプリケーションを構築してvirtualenvという名前の仮想環境を作成した場合、次のfoobarようなディレクトリ構造から始めます。

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}

この環境が作成されたら、どこに独自の環境を配置しますか。

  • Pythonファイル?
  • 静的ファイル(画像/その他)?
  • オンラインで入手できるが、チーズショップにないパッケージなどの「カスタム」パッケージ?

virtualenvディレクトリに関連して?

virtualenvディレクトリ自体がどこに行くべきか私はすでに知っていると仮定します。)


8
@jkp:同意しません。Pythonアプリケーションのレイアウト方法は、開発目的でvirtualenv内にそのアプリケーションを配置する方法とは異なります。それは関連していますが、同じではありません。重複して閉じないでください。
jcdyer 2009年

回答:


90

virtualenvアプリケーションインスタンスではなく、Pythonインタープリターインスタンスを提供します。通常、システムのデフォルトのPythonを含むディレクトリ内にアプリケーションファイルを作成することはありません。同様に、virtualenvディレクトリ内にアプリケーションを配置する必要もありません。

たとえば、同じvirtualenvを使用する複数のアプリケーションがあるプロジェクトがあるとします。または、後でシステムPythonでデプロイされるvirtualenvを使用してアプリケーションをテストしている場合もあります。または、スタンドアロンのアプリをパッケージ化して、virtualenvディレクトリをアプリディレクトリ自体のどこかに配置することが理にかなっている可能性があります。

ですから、一般的には、質問に対する正しい答えは1つではないと思います。そして、良い点virtualenvは、それが多くの異なるユースケースをサポートしているということです:1つの正しい方法である必要はありません。


8
同意した。私はすべての作業にvirtualenvを使用しており、virtualenvディレクトリ内にファイルを配置することはありません。Virtualenvはプロジェクト構造に影響を与える必要はありません。virtualenvをアクティブにして(またはそのbin / pythonを使用して)、どこにいてもファイルを操作します。
カールマイヤー

私も心から同意します。私は一度、これまでの私のvirtualenvの内部の任意のファイルを触れるには、(私が使用してvirtualenvwrapper私が編集したいとき)であるpostactivatepostdeactivateフック。
Thane Brimhall 2013年

この質問の他の回答に見られるように、トレードオフを含むさまざまなオプションの具体的で実用的な例を使用すると、質問の回答が得られます。
andyfeller 2018年

2
プロジェクトをvirtualenvディレクトリに分離しておく方がきれいですがvirtualenv、システムのpythonと比較することは役に立ちません。目的virtualenvは、壊れた依存関係を修正し、プロジェクトを分離して、異なるパッケージバージョンやpythonバージョンを使用できるようにするためです(これは事前に記述されていることを理解しています) -python3)。アプリに共有を許可することは、システムpythonであるかのようにvirtualenv使用virtualenvし、virtualenvが解決するように設計された同じ問題に対してアプリを脆弱なままにします。There should be one obvious way to do it; 論理的には1:1である必要があります
Davos

@ネッド:いくつかのベストプラクティスを取得しようとしていますが、それはまだ不明です。それぞれ独自のvirtualenvを持つプロジェクトが数十ある場合、どのプロジェクトがどのvirtualenvで使用されているかをどのように追跡しますか?各フォルダーのルートに、使用するvirtualenvの名前で小さなシェルスクリプトを追加しますか?
ccpizza

57

たまに少数のプロジェクトしかない場合でも、プロジェクトごとに新しいvirtualenvを作成し、パッケージをすぐに配置することを妨げるものはありません。

/foobar
  /bin
    {activate, activate.py, easy_install, python}
  /include
    {python2.6/...}
  /lib
    {python2.6/...}
  /mypackage1
    __init__.py
  /mypackage2
    __init__.py

このアプローチの利点は、プロジェクト内のアクティブ化スクリプトをいつでも確実に見つけることができることです。

$ cd /foobar
$ source bin/activate
$ python 
>>> import mypackage1
>>>

もう少し整理する場合は、すべてのvirtualenvを1つのフォルダーに入れて、作業中のプロジェクトにちなんでそれぞれに名前を付けることを検討してください。

  /virtualenvs
    /foobar
      /bin
        {activate, activate.py, easy_install, python}
      /include
        {python2.6/...}
      /lib
        {python2.6/...}
  /foobar
    /mypackage1
      __init__.py
    /mypackage2
      __init__.py

このようにすると、問題が発生したときにいつでも新しいvirtualenvからやり直すことができ、プロジェクトファイルの安全性が維持されます。

もう1つの利点は、いくつかのプロジェクトで同じvirtualenvを使用できるため、依存関係が多い場合に何度も同じインストールを行う必要がないことです。

$ cd /foobar
$ source ../virtualenvs/foobar/bin/activate
$ python 
>>> import mypackage2
>>>

virtualenvを定期的に設定および破棄する必要があるユーザーにとっては、virtualenvwrapperを調べることは理にかなっています。

http://pypi.python.org/pypi/virtualenvwrapper

virtualenvwrapperでできること

* create and delete virtual environments

* organize virtual environments in a central place

* easily switch between environments

プロジェクト「foo」と「bar」で作業するとき、virtualenvがどこにあるかを心配する必要はありません。

  /foo
    /mypackage1
      __init__.py
  /bar
    /mypackage2
      __init__.py

これが、プロジェクト「foo」での作業を開始する方法です。

$ cd foo
$ workon
bar
foo
$ workon foo
(foo)$ python
>>> import mypackage1
>>>

次に、プロジェクト「bar」への切り替えは次のように簡単です。

$ cd ../bar
$ workon bar
(bar)$ python
>>> import mypackage2
>>>

かなりすっきりしていますね。


の使用に関するこの回答に強く同意しvirtualenvwrapperます。それはあなたにすべての利点を与えながらvirtualenvをきれいに抽象化します。
Thane Brimhall 2013年

5
ただし、コードを仮想環境内に配置することについては絶対に反対です。ファイルシステム上のプロジェクトの「近く」にしたい場合はvenv/、プロジェクトのと同じレベルにディレクトリを配置しますBASE_DIR
Rob Grant

30

virtualenvは再配置可能ではないため、私の意見では、virtualenvディレクトリ内にプロジェクトファイルを配置することはお勧めできません。virtualenv自体は、プロジェクトの一部ではなく、生成された開発/デプロイメントアーティファクト(一種の.pycファイルのようなもの)です。それを吹き飛ばしていつでも再作成したり、新しいデプロイホストで新しいものを作成したりするのは簡単です。

実際、多くの人がvirtualenvwrapperを使用します。これにより、実際のvirtualenvが認識からほぼ完全に削除され、デフォルトですべてが$ HOME / .virtualenvsに並んで配置されます。


これは悪い習慣であることに完全に同意します。特に、デプロイメントをテストし、不要な要件パッケージを削除するために、簡単に吹き飛ばして再作成できることを指摘するのは素晴らしいことです。virtualenvを追加したいだけです。たとえばvirtualenv --relocatable myvenvstackoverflow.com / a / 6628642/1335793を使用して再配置できます。
ダボス

2

プロジェクトにを指定するとsetup.py、pipはバージョン管理からプロジェクトを直接インポートできます。

このようなことをしてください:

$ virtualenv --no-site-packages myproject
$ . myproject/bin/activate
$ easy_install pip
$ pip install -e hg+http://bitbucket.org/owner/myproject#egg=proj

-eでプロジェクトを配置しますmyproject/srcが、リンクそれはにmyproject/lib/pythonX.X/site-packages/、あなたがお住まいの地域から輸入していることをモジュールにすぐに拾ってしまいます加えた変更そうsite-packages。この#eggビットは、作成するeggパッケージに付ける名前をpipに指示します。

を使用しない場合は--no-site-packages、pipを-Eオプションでvirtualenvにインストールするように指定するように注意してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.