Bisakah saya menginstal paket windows Python ke dalam virtualenvs?

125

Virtualenv hebat: memungkinkan saya menyimpan sejumlah instalasi Python yang berbeda sehingga dependensi proyek yang berbeda tidak semuanya dilemparkan bersama ke dalam tumpukan bersama.

Tetapi jika saya ingin menginstal paket pada Windows yang dikemas sebagai installer .exe, bagaimana saya bisa mengarahkannya untuk menginstal ke dalam virtualenv? Sebagai contoh, saya punya pycuda-0.94rc.win32-py2.6.exe. Ketika saya menjalankannya, ia memeriksa registri, dan hanya menemukan satu Python26 untuk diinstal ke dalam, yang umum bahwa virtualenv saya didasarkan dari.

Bagaimana saya bisa mengarahkannya untuk menginstal ke dalam virtualenv?

Ned Batchelder
sumber
1
jawaban di bawah ini berfungsi untuk saya stackoverflow.com/questions/6114115/…
user1960422

Jawaban:

201

Ya kamu bisa. Yang kamu butuhkan adalah

easy_install binary_installer_built_with_distutils.exe

Terkejut? Sepertinya installer biner untuk Windows yang dibuat dengan distutils menggabungkan .exe dengan .zip menjadi satu file .exe. Ubah ekstensi menjadi .zip untuk melihatnya sebagai file zip yang valid. Saya menemukan ini setelah membaca jawaban atas pertanyaan saya Di mana saya dapat mengunduh telur biner dengan psycopg2 untuk Windows?

MEMPERBARUI

Seperti dicatat oleh Tritium21 dalam jawabannya saat ini, Anda harus menggunakan pip bukan easy_install. Pip tidak dapat menginstal paket biner yang dibuat oleh distutils tetapi ia dapat menginstal paket biner dalam format roda baru . Anda dapat mengkonversi dari format lama ke yang baru menggunakan paket roda , yang harus Anda instal terlebih dahulu.

Piotr Dobrogost
sumber
2
Saya setuju, ini bagus. Omong-omong, jika Anda memiliki 7zip, Anda dapat membuka .exe secara langsung, tanpa harus menamainya sebagai zip.
Sabuncu
5
hanya sebuah tip: pengembang dapat mengunduh berbagai paket python bawaan untuk windows dari lfd.uci.edu/~gohlke/pythonlibs .
yangzh
@CodyHatch Anda bisa karena ini bukan satu-satunya jawaban saya di SO dan ada kemungkinan beberapa jawaban saya yang lain akan membantu Anda juga :)
Piotr Dobrogost
1
Saya mendapatkan yang berikut: Mencari binary-installer-built-with-distutils.exe Membaca pypi.python.org/simple/… Membaca pypi.python.org/simple/… Tidak dapat menemukan halaman indeks untuk 'binary_installer_built_with_distutils.exe' Memindai indeks semua paket (ini mungkin memakan waktu cukup lama) Membaca pypi.python.org/simple Tidak ditemukan paket lokal atau tautan unduhan yang ditemukan untuk kesalahan binary-installer-built-with-distutils.exe: Tidak dapat menemukan distribusi yang sesuai untuk Requirement.parse ('binary-instal ler-built-with-d ...
Paul
1
Paul, exe yang dia maksud akan berbeda tergantung pada installer mana yang Anda gunakan ... tidak secara harfiah "binary-installer-built-with-distutils.exe"
Tristan Reid
70

Saya tahu ini pertanyaan yang cukup lama, dan mendahului alat yang akan saya bicarakan, tetapi demi Google, saya pikir ini ide yang bagus untuk menyebutkannya. easy_install adalah domba hitam dari kemasan python. Tidak ada yang mau mengaku menggunakannya dengan panasnya pip baru. Selain itu, ketika memainkan trik registri akan bekerja paling baik untuk installer EXE non-standar (seseorang membuat sendiri installer daripada menggunakan distutils, dan memeriksa registri untuk jalur instalasi), sekarang ada Better Way (c) untuk installer EXE standar .

pip install wheel
wheel convert INSTALLER.EXE
pip install NEW_FILE_CREATED_IN_LAST_STEP.whl

Format roda, diperkenalkan baru-baru ini pada posting ini, adalah pengganti untuk format telur, mengisi peran yang hampir sama. Format ini juga didukung oleh pip (alat yang sudah diinstal di virtualenv Anda).

jika karena alasan tertentu pip install WHEELFILEtidak berhasil, cobawheel install WHEELFILE

Tritium21
sumber
Terima kasih untuk ini. Semoga lebih banyak orang memperhatikan jawaban dan dukungan Anda!
Brett Stottlemyer
Agar jelas. Anda dapat membuat .whl dari .exe, misalnya dari lfd.uci.edu/~gohlke/pythonlibs , dengan ini. Ini adalah ketentuan penerapan yang BESAR!
Jonas Gröger
Saya mencoba melakukan ini, tetapi mendapat konversi roda konversi numpy-MKL-1.8.1.win-amd64-py2.7.exe kemudian pip instal numpy-1.8.1-cp27-none-win_amd64.whl saya mendapatkan kesalahan berikut Mengunduh / membongkar numpy-1.8.1-cp27-none-win-amd64.whl Tidak dapat menemukan unduhan yang memenuhi persyaratan numpy-1.8.1-cp27-non e-win-amd64.whl Tidak ada distribusi yang ditemukan untuk numpy -1.8.1-cp27-none-win-amd64.whl
Paul
coba wheel install WHEELFILE, jawab diedit untuk menunjukkan keberadaan itu. Men-debug masalah khusus untuk seseorang bukanlah hal sepele yang dilakukan dalam komentar SO.
Tritium21
Setelah memerlukan easy_install berkali-kali hanya untuk tujuan ini, itu sangat indah. * dengan air mata melambaikan tangan ke easy_install
KobeJohn
40

Saya akhirnya mengadaptasi skrip ( http://effbot.org/zone/python-register.htm ) untuk mendaftarkan instalasi Python di registri. Saya bisa memilih Python untuk menjadi yang Python di registri, jalankan installer Windows, kemudian mengatur kembali registri:

# -*- encoding: utf-8 -*-
#
# script to register Python 2.0 or later for use with win32all
# and other extensions that require Python registry settings
#
# Adapted by Ned Batchelder from a script
# written by Joakim Löw for Secret Labs AB / PythonWare
#
# source:
# http://www.pythonware.com/products/works/articles/regpy20.htm

import sys

from _winreg import *

# tweak as necessary
version = sys.version[:3]
installpath = sys.prefix

regpath = "SOFTWARE\\Python\\Pythoncore\\%s\\" % (version)
installkey = "InstallPath"
pythonkey = "PythonPath"
pythonpath = "%s;%s\\Lib\\;%s\\DLLs\\" % (
    installpath, installpath, installpath
)

def RegisterPy():
    try:
        reg = OpenKey(HKEY_LOCAL_MACHINE, regpath)
    except EnvironmentError:
        try:
            reg = CreateKey(HKEY_LOCAL_MACHINE, regpath)
        except Exception, e:
            print "*** Unable to register: %s" % e
            return

    SetValue(reg, installkey, REG_SZ, installpath)
    SetValue(reg, pythonkey, REG_SZ, pythonpath)
    CloseKey(reg)
    print "--- Python %s at %s is now registered!" % (version, installpath)

if __name__ == "__main__":
    RegisterPy()

Jalankan skrip ini dengan Python yang ingin Anda daftarkan, dan itu akan dimasukkan ke dalam registri. Perhatikan bahwa pada Windows 7 dan Vista, Anda memerlukan hak istimewa Administrator.

Ned Batchelder
sumber
1
Pada Windows 7, 64 bit, dengan 64 bit Python harus memodifikasi regpath keregpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Oleksiy
Sebenarnya untuk windows 7, 64 bit, saya meninggalkan regpath apa adanya dan berhasil. Mod @Oleksiy yang disarankan tidak berfungsi. Mungkin ada beberapa perbedaan halus dalam versi OS kami, atau pengaturan.
Paul
@Ned Solusi Batchelder adalah satu-satunya yang bekerja untuk saya. Pemasangan roda tidak berfungsi. Saya masih menerima kesalahan unduhan paket (lihat komentar saya pada jawaban itu untuk lebih jelasnya). Saran untuk melakukan binary_installer easy_install ... mungkin berhasil tetapi saya tidak bisa mendapatkan easy_install untuk menemukan file binary_installer ... exe.
Paul
7

easy_install dapat menginstal paket .exe selama mereka dibangun menggunakan target bdist_wininst distutils, yang mencakup banyak paket populer. Namun, ada banyak lainnya yang tidak (wxPython adalah salah satu yang saya perjuangkan)

Simon King
sumber
Ya, dan selama Anda telah menginstal paket pengembangan apa pun dari semua dependensi. Dalam kasus saya, pycuda membutuhkan Boost dan CUDA, bukan pekerjaan yang sepele.
Ned Batchelder
1
@Ned Batchelder Ya, dan selama Anda telah menginstal paket pengembangan apa pun dari semua dependensi. Penginstal biner juga tidak menginstal semua dependensi, bukan?
Piotr Dobrogost
0

Anda dapat menggunakan easy_install lingkungan untuk menginstal PyCUDA.

dev-env-path/bin/easy_install pycuda

itu akan memberi Anda versi 0.94rc yang sama.

Pada Windows easy_install.exe akan berada di direktori Script.

cukup keras
sumber
1
Sayangnya, ini akan mencoba membangun dari sumber. Saya berharap untuk menggunakan binari pra-dibangun.
Ned Batchelder
0

Jika a .msi, Anda mungkin dapat menentukan opsi baris perintah menggunakan msiexec. Penginstal Python sendiri memungkinkanTARGETDIR , tapi saya tidak yakin apakah distutils mem-bakes ini ke installer distribusi.

Jika Anda menggunakan .exe, saya tidak berpikir ada cara yang bersih. Salah satu opsi adalah menggunakan program seperti 7Zip (atau winzip, dll) untuk secara langsung mengekstraksi konten exe, lalu salin folder relevan ke dalam folder paket situs virtual Anda. Sebagai contoh, jika saya mengekstrak "processing-0.5.2.win32-py2.5.exe", saya menemukan folder "PLATLIB \ processing" yang saya salin ke jalur virtualenv dan digunakan tanpa masalah runtime. (Aku tidak yakin itu selalu sesederhana itu.)

ars
sumber