Tôi có thể cài đặt các gói cửa sổ Python vào virtualenvs không?


125

Virtualenv thật tuyệt: nó cho phép tôi giữ một số cài đặt Python riêng biệt để các phần phụ thuộc của các dự án khác nhau không bị ném vào một đống chung.

Nhưng nếu tôi muốn cài đặt một gói trên Windows được đóng gói dưới dạng trình cài đặt .exe, làm cách nào tôi có thể hướng nó để cài đặt vào virtualenv? Ví dụ: tôi có pycuda-0.94rc.win32-py2.6.exe. Khi tôi chạy nó, nó sẽ kiểm tra sổ đăng ký và chỉ tìm thấy một Python26 để cài đặt, cái phổ biến mà virtualenv của tôi dựa trên.

Làm thế nào tôi có thể hướng nó để cài đặt vào virtualenv?


1
câu trả lời dưới đây hoạt động với tôi stackoverflow.com/questions/6114115/
Ấn

Câu trả lời:


201

Vâng, bạn có thể. Tất cả bạn cần là

easy_install binary_installer_built_with_distutils.exe

Ngạc nhiên? Dường như các trình cài đặt nhị phân cho Windows được tạo bằng distutils kết hợp .exe với .zip thành một tệp .exe. Thay đổi phần mở rộng thành .zip để xem đó là tệp zip hợp lệ. Tôi đã phát hiện ra điều này sau khi đọc câu trả lời cho câu hỏi của mình Tôi có thể tải xuống trứng nhị phân với psycopg2 cho Windows ở đâu?

CẬP NHẬT

Như Tritium21 đã lưu ý trong câu trả lời của anh ấy hiện nay, bạn nên sử dụng pip thay vì easy_install. Pip không thể cài đặt các gói nhị phân được tạo bởi distutils nhưng nó có thể cài đặt các gói nhị phân ở định dạng bánh xe mới . Bạn có thể chuyển đổi từ định dạng cũ sang định dạng mới bằng gói bánh xe mà bạn phải cài đặt trước.


2
Tôi đồng ý, điều này là tuyệt vời. Nhân tiện, nếu bạn có 7zip, bạn có thể mở .exe trực tiếp mà không phải đổi tên thành zip.
Sabuncu

5
chỉ là một mẹo: các nhà phát triển có thể tải xuống các gói python được xây dựng khác nhau cho các cửa sổ từ lfd.uci.edu/~gohlke/pythonlibs .
yangzh

@CodyHatch Bạn có thể vì đây không phải là câu trả lời duy nhất của tôi về SO và có khả năng một số câu trả lời khác của tôi cũng hữu ích cho bạn :)
Piotr Dobrogost

1
Tôi nhận được những điều sau: Tìm kiếm trình cài đặt nhị phân được xây dựng với distutils.exe Đọc pypi.python.org/simple/. Đọc pypi.python.org/simple/. Không thể tìm thấy trang chỉ mục cho 'binary_installer_built_with_distutils.exe' Chỉ mục quét của tất cả các gói (việc này có thể mất một lúc) Đọc pypi.python.org/simple Không tìm thấy gói địa phương hoặc liên kết tải xuống nào đối với lỗi cài đặt nhị phân được cài đặt với distutils.exe: Không thể tìm thấy phân phối phù hợp cho Requestement.parse ('Ler-instal ler-build-with-d ...
Paul

1
Paul, exe mà anh ấy đề cập sẽ khác nhau tùy thuộc vào trình cài đặt nào bạn đang sử dụng ... không phải theo nghĩa đen là "trình cài đặt nhị phân được xây dựng với distutils.exe"
Tristan Reid

70

Tôi biết đây là một câu hỏi khá cũ và có trước các công cụ mà tôi sắp nói đến, nhưng vì lợi ích của Google, tôi nghĩ rằng đó là một ý tưởng tốt để đề cập đến nó. easy_install là con cừu đen của bao bì trăn. Không ai muốn thừa nhận sử dụng nó với độ nóng mới của pip xung quanh. Ngoài ra, trong khi chơi các thủ thuật đăng ký sẽ hoạt động tốt nhất cho các trình cài đặt EXE không chuẩn (ai đó đã tự xây dựng trình cài đặt thay vì sử dụng distutils và đang kiểm tra sổ đăng ký cho đường dẫn cài đặt), giờ đây đã có Cách tốt hơn (c) cho các trình cài đặt EXE tiêu chuẩn .

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

Định dạng bánh xe, được giới thiệu gần đây như của bài đăng này, là sự thay thế cho định dạng trứng, đóng vai trò tương tự. Định dạng này cũng được hỗ trợ bởi pip (một công cụ đã được cài đặt trong virtualenv của bạn).

nếu vì lý do pip install WHEELFILEnào đó không hoạt động, hãy thửwheel install WHEELFILE


Cảm ơn vì điều đó. Hy vọng nhiều người chú ý đến câu trả lời của bạn và upvote!
Brett Stottlemyer

Để được rõ ràng. Bạn có thể tạo .whl từ .exe, ví dụ từ lfd.uci.edu/~gohlke/pythonlibs , với điều này. Đây là điều khoản triển khai HUGE!
Jonas Gröger

Tôi đã cố gắng để làm điều này, nhưng đã có một bánh xe lỗi chuyển đổi numpy-MKL-1.8.1.win-amd64-py2.7.exe sau đó pip cài đặt numpy-1.8.1-cp27-none-win_amd64.khi tôi nhận được lỗi sau Tải xuống / giải nén numpy-1.8.1-cp27-none-win-amd64.whl Không thể tìm thấy bất kỳ tải xuống nào đáp ứng yêu cầu numpy-1.8.1-cp27-non e-win-amd64.whl Không tìm thấy bản phân phối nào cho numpy -1.8.1-cp27-none-win-amd64.whl
Paul

Hãy thử wheel install WHEELFILE, trả lời chỉnh sửa để chỉ ra sự tồn tại của điều đó. Gỡ lỗi một vấn đề cụ thể cho ai đó không phải là một việc nhỏ được thực hiện trong các bình luận SO.
Tritium21

Sau khi cần easy_install rất nhiều lần chỉ cho mục đích này, điều đó thật tuyệt. * sóng nước mắt tạm biệt với easy_install
KobeJohn

40

Cuối cùng tôi đã điều chỉnh một tập lệnh ( http://effbot.org/zone/python-register.htm ) để đăng ký cài đặt Python trong sổ đăng ký. Tôi có thể chọn Python là các Python trong registry, chạy trình cài đặt Windows, sau đó thiết lập lại registry:

# -*- 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()

Chạy đoạn script này với Python mà bạn muốn được đăng ký và nó sẽ được nhập vào registry. Lưu ý rằng trên Windows 7 và Vista, bạn sẽ cần đặc quyền của Quản trị viên.


1
Trên Windows 7, 64 bit, với 64 bit Python đã phải sửa đổi regpath thànhregpath = "SOFTWARE\\Wow6432Node\\Python\\Pythoncore\\%s\\" % (version)
Oleksiy

Trên thực tế, đối với các cửa sổ 7, 64 bit của tôi, tôi đã để lại sự thông cảm và nó đã hoạt động. Bản mod @Oleksiy đề xuất không hoạt động. Có lẽ một số khác biệt tinh tế trong phiên bản hệ điều hành của chúng tôi, hoặc một số cài đặt.
Paul

@Ned Giải pháp của Batchelder là giải pháp duy nhất phù hợp với tôi. Việc lắp đặt bánh xe không hoạt động. Tôi vẫn nhận được lỗi tải xuống gói (xem nhận xét của tôi về câu trả lời đó để biết thêm chi tiết). Đề xuất thực hiện easy_install binary_installer ... có thể đã hoạt động nhưng tôi không thể lấy easy_install để tìm tệp binary_installer ... exe.
Paul

7

easy_install có thể cài đặt các gói .exe miễn là chúng được xây dựng bằng cách sử dụng mục tiêu bdist_wininst của distutils, bao gồm nhiều gói phổ biến. Tuy nhiên, có nhiều thứ khác không (wxPython là một thứ mà tôi đã đấu tranh)


Có, và miễn là bạn đã cài đặt bất kỳ gói phát triển nào của tất cả các phụ thuộc. Trong trường hợp của tôi, pycuda cần Boost và CUDA, không phải là một công việc tầm thường.
Ned Batchelder

1
@Ned Batchelder Có, và miễn là bạn đã cài đặt bất kỳ gói phát triển nào của tất cả các phụ thuộc. Vâng, trình cài đặt nhị phân không cài đặt tất cả các phụ thuộc, phải không?
Piotr Dobrogost

0

Bạn có thể sử dụng easy_install của môi trường để cài đặt PyCUDA.

dev-env-path/bin/easy_install pycuda

nó sẽ cung cấp cho bạn cùng một phiên bản 0.94rc.

Trên Windows easy_install.exe sẽ nằm trong thư mục ScScript.


1
Thật không may, điều này sẽ cố gắng xây dựng từ nguồn. Tôi đã hy vọng sử dụng nhị phân dựng sẵn.
Ned Batchelder

0

Nếu là a .msi, bạn có thể chỉ định các tùy chọn dòng lệnh bằng cách sử dụng msiexec. Trình cài đặt Python tự cho phépTARGETDIR , nhưng tôi không chắc liệu distutils có đưa trình cài đặt này vào trình cài đặt phân phối hay không.

Nếu bạn đang sử dụng một .exe, tôi không nghĩ có một cách sạch sẽ. Một tùy chọn là sử dụng một chương trình như 7Zip (hoặc winzip, v.v.) để trích xuất trực tiếp nội dung của exe, sau đó sao chép các thư mục có liên quan vào thư mục gói trang web ảo của bạn. Ví dụ: nếu tôi trích xuất "process-0.5.2.win32-py2.5.exe", tôi tìm thấy một thư mục "PLATLIB \ process" mà tôi sao chép vào đường dẫn virtualenv và sử dụng mà không gặp vấn đề gì về thời gian chạy. (Tôi không chắc nó luôn đơn giản như vậy.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.