2015-10-25 48 views
19

Có cách nào để buộc trình biên dịch một cách rõ ràng để xây dựng các phần mở rộng của Cython khi chạy python setup.py install không? Nơi setup.py có dạng:Buộc trình biên dịch khi chạy python setup.py cài đặt

import os.path 
import numpy as np 
from setuptools import setup, find_packages, Extension 
from Cython.Distutils import build_ext 

setup(name='test', 
    packages=find_packages(), 
    cmdclass={'build_ext': build_ext}, 
    ext_modules = [ Extension("test.func", ["test/func.pyx"]) ], 
    include_dirs=[np.get_include()] 
) 

Tôi đang cố gắng để cài đặt một gói phần mềm trên Windows 8.1 x64 sử dụng Anaconda 3.16, Python 3.4, setuptools 18, numpy 1.9 và Cython 0.24. Kịch bản triển khai được điều chỉnh từ câu trả lời của Cython wikithis Stack Overflow.

Makefile.bat

:: create and activate a virtual environement with conda 
conda create --yes -n test_env cython setuptools=18 pywin32 libpython numpy=1.9 python=3 
call activate test_env 

:: activate the MS SDK compiler as explained in the Cython wiki 
cd C:\Program Files\Microsoft SDKs\Windows\v7.1\ 
set MSSdk=1 
set DISTUTILS_USE_SDK=1 
@call .\Bin\SetEnv /x64 /release 

cd C:\test 
python setup.py install 

Vấn đề là trong trường hợp này setup.py install vẫn sử dụng trình biên dịch mingw kèm conda thay cho MS Windows SDK 7.1 một.

  • Vì vậy, các DISTUTILS_USE_SDK=1MSSdk=1 dường như không có tác động trên buid. Tôi không chắc chắn nếu kích hoạt MS SDK từ bên trong một conda virtualenv có thể là một vấn đề ở đây.

  • Chạy python setup.py build_ext --compiler=msvc xây dựng tiện ích mở rộng một cách chính xác với trình biên dịch MS, nhưng sau đó chạy lại setup.py install, biên dịch lại bằng mingw. Tương tự áp dụng cho python setup.py build --compiler=msvc.

  • Cũng thử chạy %COMSPEC% /E:ON /V:ON /K "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" như được thảo luận trong câu trả lời được liên kết ở trên, nhưng đối với tôi, điều này tạo ra lời nhắc thiết bị đầu cuối mới, được tô màu vàng và dừng quá trình cài đặt.

Có cách nào buộc trình biên dịch xây dựng gói này, ví dụ: bằng cách chỉnh sửa setup.py?

+2

Hãy thử sử dụng 'python setup.py build_ext --compiler = msvc --force' để buộc trình biên dịch tạo/xây dựng lại gói và xem điều gì xảy ra. – romeric

+0

@romeric Vì vậy, 'build_ext' xây dựng phần mở rộng với MS VC như mong đợi (cả có và không có cờ' --force'). Vấn đề là khi tôi chạy 'install' nó được xây dựng lại với mingw. – rth

Trả lời

14

Bạn có thể cung cấp (mặc định) đối số dòng lệnh cho méo trong một tệp riêng biệt gọi là setup.cfg (đặt song song với setup.py) của bạn. Xem docs để biết thêm thông tin. Để thiết lập một cái gì đó trình biên dịch sử dụng như:

[build] 
compiler=msvc 

Bây giờ gọi python setup.py build tương đương với gọi python setup.py build --compiler=msvc. (Bạn có thể vẫn distutils trực tiếp sử dụng một trình biên dịch khác bằng cách gọi python setup.py build --compiler=someothercompiler)

distutils Bây giờ bạn đã (đạo diễn thành công để sử dụng một trình biên dịch MSVC. Đáng tiếc là không có tùy chọn để cho nó biên dịch MSVC để sử dụng. về cơ bản có hai lựa chọn:

một:. không làm gì cả và distutils sẽ cố gắng xác định vị trí vcvarsall.bat và sử dụng để thiết lập một môi trường vcvarsall.bat (và trình biên dịch nó đặt môi trường ký) được một phần của Visual Studio, vì vậy bạn phải cài đặt để nó hoạt động.

Hai: Cài đặt Windows SDK và yêu cầu các distutils sử dụng. Xin lưu ý rằng tên DISUTILS_USE_SDK khá là gây nhầm lẫn (ít nhất theo ý kiến ​​của tôi).Nó không thực sự nói cho các distutils sử dụng SDK (và nó là setenv.bat) để thiết lập một môi trường, thay vì nó có nghĩa là các distutils nên giả định môi trường đã được thiết lập. Đó là lý do tại sao bạn phải sử dụng một số loại Makefile.bat như bạn đã thể hiện trong OP.

Ghi chú bên: Phiên bản cụ thể của VisualStudio hoặc Windows SDK tùy thuộc vào phiên bản python được nhắm mục tiêu.

+1

Cảm ơn câu trả lời của bạn, xác định trình biên dịch trong 'setup.cfg' không giải quyết vấn đề trên Windows. Vấn đề là chỉ cần thêm tập tin này cũng phá vỡ cài đặt trên Linux mà nên sử dụng trình biên dịch gcc và không phải MS VC. Tất nhiên nó có thể tạo ra 'setup.cfg' trong thời gian chạy, nhưng tôi tự hỏi nếu nó có thể hack tùy chọn trình biên dịch thông qua' setup.py' sẽ linh hoạt hơn ... – rth

+1

Như một suy nghĩ: Tôi Giả sử, bạn có thể hack các distutils để làm cho bạn muốn, chúng ta đang nói về Python ở đây sau khi tất cả. Điểm để nhắm mục tiêu có thể là lệnh 'build_ext', như trong việc tạo lại một phiên bản đã sửa đổi hoặc lấy lại một sửa đổi phiên bản hiện có. Đó là ấn tượng của tôi tuy nhiên rằng toàn bộ các méo khá phức tạp (có thể xuất phát từ bản chất của sự vật, và không thể tránh được) và do đó rất khó hiểu ngay từ cái nhìn đầu tiên. Các thiết lập trình biên dịch MS là khá phức tạp và đã không được xúc động thường xuyên vì sợ phá vỡ khả năng tương thích ngược (ý kiến ​​của tôi và đoán) – PeterE

+0

'setup.cfg' là một tập tin mà người dùng có toàn quyền kiểm soát. Bạn không nên phân phối nó với mã của bạn. –

0

Như một nhận xét: trên linux, bạn có thể sử dụng nhiều biến môi trường autoconf. Đối với trình biên dịch

CC=mpicc python setup.py build_ext -i 
Các vấn đề liên quan