Instal paket ke virtualenv menggunakan apt-get

16

Menurut jawaban ini , apt-getinstal paket ke seluruh sistem (dari kanonik), dan hanya pipdapat menginstal paket ke dalam virtualenv (dari Pypi).

Namun, saya perlu menginstal paket ke dalam virtualenv yang hanya dapat diakses melalui apt-get, yaitu tidak di-host oleh Pypi.

Bagaimana aku melakukan itu?

Roma
sumber
Pertanyaan bagus sobat.
rɑːdʒɑ

Jawaban:

8

Alternatif lain adalah mengunduh file dengan apt-get download, mengekstraknya, dpkg -xdan memindahkan file yang diekstrak ke virtualenv Anda:

Contoh:

apt-get download python-xyz

anggap ini menghasilkan:

./python-xyz_1.2.3-3ubuntu5_amd64.deb

Lalu, gunakan dpkg untuk mengekstrak bagian data dari file .deb:

dpkg -x python-xyz_1.2.3-3ubuntu5_amd64.deb ./xyz-tmp

Di ./xyz-tmpdirektori yang baru dibuat , Anda sekarang memiliki semua file yang akan diinstal ke /(root) seandainya Anda menggunakan apt-get install.

Asumsikan mereka adalah:

./xyz-tmp/usr/lib/python2.7/dist-packages/xyz/
./xyz-tmp/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info

Anda masih perlu memetakan subdirektori (mis. dist-packagesVs. site-packages), dan kemudian dapat memindahkan file ke virtualenv Anda (dengan asumsi virtualenv /home/user/.virtualenvs/py27):

mv ./xyz-tmp/usr/lib/python2.7/dist-packages/* /home/user/.virtualenvs/py27/lib/python2.7/site-packages/

Dibandingkan dengan jawaban saya sebelumnya, pendekatan ini memiliki keuntungan bahwa Anda tidak perlu meneliti file mana yang diinstal, karena Anda dapat melihatnya di direktori ekstraksi. Itu masih membutuhkan pemetaan direktori antara arsip yang diekstraksi dan virtualenv.

Andreas Maier
sumber
+1, inilah contoh lain dari pendekatan ini, yang berfungsi cukup baik untuk menginstal paket yang hanya dapat diakses melalui APT ke dalam virtualenv - melakukan sesuatu yang serupa baru-baru ini menggunakan Python 3.7.
RichVel
0

Semua yang diperlukan untuk virtualenv adalah keberadaan file paket di subtree dari virtualenv Anda. Jadi selama Anda dapat menentukan file mana saja yang diinstal ke dalam sistem Python melalui apt-get, Anda dapat menyalinnya ke virtualenv Anda. Ini termasuk file dalam direktori paket situs serta di tempat lain dalam subtree Python Anda (misalnya skrip).

Contoh hipotesis:

sudo apt-get python-xyz

Asumsikan menginstal paket bernama "xyz" ke dalam sistem Anda Python 2.7, Anda mungkin mendapatkan ini:

/usr/lib/python2.7/dist-packages/xyz/
/usr/lib/python2.7/dist-packages/xyz-1.2.3.egg-info

Salin file yang terkait dengan paket "xyz" ke virtualenv Anda (dengan asumsi virtualenv /home/user/.virtualenvs/py27):

/home/user/.virtualenvs/py27/lib/python2.7/site-packages/xzy/
/home/user/.virtualenvs/py27/lib/python2.7/site-packages/xzy-1.2.3.egg-info

Kesulitannya adalah (1) dalam menentukan file mana yang termasuk dalam paket tertentu, dan (2) dalam memetakan subdirektori yang sesuai antara sistem Python dan virtualenv (misalnya dist-packagesvs. site-packagesdalam contoh di atas).

Jika ada yang lebih berpengalaman dengan ini, silakan komentar.

Andreas Maier
sumber