2010-09-14 10 views
6

Gần đây tôi đã cập nhật từ Python 2.5 lên 2.7 (tôi đã thử 2.6 trong thời gian phức tạp) và trong khi mọi thứ hoạt động tốt từ dòng lệnh hoặc trong máy chủ Django, mod_wsgi không thể tải bất kỳ mô đun nào chứa DLL (pyd) được tạo bằng MSVC.Tại sao không có DLL Python được xây dựng với tải MSVC với mod_wsgi?

Ví dụ, nếu tôi xây dựng phiên bản riêng của tôi về pycrypto hoặc lxml sau đó tôi sẽ nhận được lỗi sau đây chỉ từ mod_wsgi:

ImportError at/
DLL load failed: The specified module could not be found. 

Ngay cả những chương trình PIL chính thức sẽ thất bại trong việc nhập khẩu các mô-đun _imaging C trong mod_wsgi nhưng đó có thể là một vấn đề khác.

Tuy nhiên, nếu tôi sử dụng phiên bản pycrypto được xây dựng với MinGW từ một nơi nào đó như http://www.voidspace.org.uk/python/modules.shtml#pycrypto thì nó sẽ nhập tốt ngay cả trong mod_wsgi. Tôi không tìm thấy giải pháp này thỏa đáng mặc dù vì toàn bộ lý do tôi cập nhật Python là để tránh tìm kiếm các tệp nhị phân dựng sẵn và tôi không thể tự xây dựng chúng vì MinGW không thành công> 50% thời gian cho tôi.

EDIT2: Tôi nhận thấy điều này trong Python27/Lib/distutils/msvc9compiler.py trên dòng 680-705:

try: 
    # Remove references to the Visual C runtime, so they will 
    # fall through to the Visual C dependency of Python.exe. 
    # This way, when installed for a restricted user (e.g. 
    # runtimes are not in WinSxS folder, but in Python's own 
    # folder), the runtimes do not need to be in every folder 
    # with .pyd's. 
    manifest_f = open(manifest_file) 
    try: 
     manifest_buf = manifest_f.read() 
    finally: 
     manifest_f.close() 
    pattern = re.compile(
     r"""<assemblyIdentity.*?name=("|')Microsoft\."""\ 
     r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""", 
     re.DOTALL) 
    manifest_buf = re.sub(pattern, "", manifest_buf) 
    pattern = "<dependentAssembly>\s*</dependentAssembly>" 
    manifest_buf = re.sub(pattern, "", manifest_buf) 
    manifest_f = open(manifest_file, 'w') 
    try: 
     manifest_f.write(manifest_buf) 
    finally: 
     manifest_f.close() 
except IOError: 
    pass 

này có thể giải thích lý do tại sao mọi thứ hoạt động từ dòng lệnh nhưng không phải trong mod_wsgi. Nhận xét tất cả điều này có vẻ như khắc phục được sự cố nhưng không cảm thấy thích sửa lỗi thích hợp. Các câu hỏi bây giờ là nơi để đặt msvcr90.dll để Apache có thể sử dụng nó? Tôi nhận thấy rằng thư mục bin của Apache chứa msvcr70.dll và msvcr80.dll nhưng đặt 90 trong đó không hoạt động.

+1

Bỏ qua loại bỏ biểu hiện làm việc cho tôi dưới IIS quá với pyodbc – lambacck

Trả lời

1

Trong khi tôi không biết gì về mod_wsgi, tôi dám đoán rằng lý do có thể xảy ra nhất là thiếu phụ thuộc thời gian chạy. Bạn có thể muốn kiểm tra MSVC-build của mình với Phụ thuộc Walker đi cùng với MSVC (ví dụ: trong MSVC 2005, nó nằm ở \ Common7 \ Tools \ Bin \ Depends.Exe). Nó sẽ cho bạn thấy các tệp DLL nào được yêu cầu bởi một nhị phân.

Như một giải pháp khác, có thể xây dựng mô-đun của bạn với thời gian chạy được liên kết tĩnh (xem Thuộc tính dự án -> C/C++ -> Tạo mã -> Thời gian chạy - chọn "Đa luồng" (không phải "Đa luồng DLL"); hoặc, nếu xây dựng từ dòng lệnh, hãy đảm bảo sử dụng /MT thay vì /MD). Tuy nhiên, có thể có vấn đề nếu những thứ phụ thuộc vào thời gian chạy (ví dụ: đối tượng FILE *) ranh giới mô-đun chéo.

UPD Nếu bạn có đúng VC redist cài đặt, lý do có thể là một vấn đề với cấu hình SxS (tức là biểu hiện của .pyd bản thân là sai hoặc mất tích, hoặc mâu thuẫn với biểu hiện của ứng dụng đó tải .pyd). Bạn có thể sử dụng tiện ích sxstrace để xem chính xác những gì đang diễn ra. Xem Diagnosing SideBySide failures.

Ngoài ra, bạn có thử liên kết tĩnh của thời gian chạy không? Hoặc, tốt hơn, hãy kiểm tra các yêu cầu của quy trình lưu trữ của bạn là gì.

+0

Họ đang thiếu MSVCR90.DLL (và GPSVC và IESHIMS). Tôi đặt MSVCR90.DLL cùng với AES.pyd và Dependency Walker vượt qua nhưng Apache đưa ra một lỗi thời gian chạy. Tôi có redist VC và MSVCR90.dll là trong các thư mục khác nhau theo C: \ Windows \ winsxs. Bất kỳ ý tưởng? –

+0

Tôi đã chỉnh sửa câu hỏi gốc để hiển thị cách AES.pyd thực sự được xây dựng. Nó có thể đã bị xao lãng như một lời bình luận. –

+0

@Kyle MacFarlane - Tôi đã chỉnh sửa câu trả lời của mình theo các ý kiến ​​ – atzz

0

Tôi đã gặp lỗi này với zmq. Giải pháp là bao gồm tệp kê khai python27.dll trong tệp libzmq.pyd (và nó có khả năng hoạt động với các tệp khác của pyd/dll). Đảm bảo bạn sử dụng tất cả 64 bit hoặc tất cả 32 bit.

"C:\Program Files (x86)\Windows Kits\8.0\bin\x64\mt.exe" -inputresource:C:\windows\system32\python27.dll;#2 -outputresource:libzmq.pyd;#2 

Xem https://code.google.com/p/pyodbc/issues/detail?id=214