サイトパッケージのないUbuntuのVirtualenv
-
05-07-2019 - |
質問
最近、Pythonでの開発中にvirtualenvを使用しました。 --no-site-packagesオプションを使用した分離された開発環境のアイデアが好きですが、PyGTKアプリの開発中にこれを行うのは少し難しい場合があります。 PyGTKモジュールはデフォルトでUbuntuにインストールされますが、システムの他の場所にある特定のモジュールを認識できるように(--no-site-packagesを使用して)virtualenvにしたいと思います。
これを行う最良の方法は何ですか?または、単にそれを吸い込んで--no-site-packagesオプションをドロップする必要がありますか?
解決
$ virtualenv --no-site-packages --python=/usr/bin/python2.6 myvirtualenv
$ cd myvirtualenv
$ source bin/activate
$ cd lib/python2.6/
$ ln -s /usr/lib/pymodules/python2.6/gtk-2.0/
$ ln -s /usr/lib/pymodules/python2.6/pygtk.pth
$ ln -s /usr/lib/pymodules/python2.6/pygtk.py
$ ln -s /usr/lib/pymodules/python2.6/cairo/
$ python
>>> import pygtk
>>> import gtk
他のヒント
1つの方法は、sys.pathを使用してコードにパスを追加することです。
import sys
sys.path.append(somepath)
別の方法は、sys.pathへの追加に加えて.pthファイルを処理するサイトを使用することです。
import site
site.addsitedir(sitedir, known_paths=None)
https://docs.python.org/library/site.html
ただし、これを関連するすべてのコードに追加したくない場合があります。
このようなことを実行するためにsitecustomize.pyが使用されているという記述を見てきましたが、いくつかのテストの後、期待どおりに動作させることができませんでした。
ここでは、sitecustomize.pyの自動インポートが2.5で終了したことに言及しています。2.5を使用していない場合は試してみてください。 (上記のパス追加メソッドのいずれかをファイルに追加し、プログラムが実行されているディレクトリにドロップするだけです) 回避方法は、2.5以降のユーザー向けの投稿に記載されています。
この状況では、シンボリックリンク、または特定のファイル(パッケージ、モジュール、拡張機能)のコピーでさえうまく動作します。
プログラムを開発環境に合わせてアプリケーションを変更するのではなく、ターゲット環境での実行をエミュレートできます。
AppEngineのようなものと同じ取引。
こちらでpostmkvirtualenvフックスクリプトを確認してください:
https://stackoverflow.com/a/9716100/60247
その場合、彼は新しいVirtualenvが作成された後にPyQtとSIPをインポートするためにそれを使用していますが、必要なパッケージをLIBSに追加できます。
そして素晴らしいので、そのスクリプトに投票してください:)
virtualenvに関連するシステムのpython gtk-2.0へのリンクを含めたい場合は、pipを使用して ruamel.venvgtk :
pip install ruamel.venvgtk 何もインポートしていません。リンクはインストール中にセットアップされます。
これは、 tox
を使用している場合に特に便利です。その場合、依存関係(toxの場合)のみを含める必要があります。
deps:
pytest
ruamel.venvgtk
および新しくセットアップされたpython2.7環境には、テストの実行前に関連リンクが含まれます。
リンクの設定方法の詳細については、この回答
をご覧ください。