2013-09-05 107 views
7

Gần đây tôi đã chuyển chương trình của mình sang máy tính Windows 7 64 bit và đã cài đặt các thư viện có liên quan. Tuy nhiên tôi đang gặp vấn đề với thư viện Scipy - Sparse.Scipy - Thư viện thưa thớt ImportError: Tải DLL bị lỗi:% 1 không phải là ứng dụng Win32 hợp lệ

Tôi đã cài đặt scipy0.12.0-amd64-py27 (như python 2.7 install là bản phát hành 64 bit) cho cửa sổ và khi sử dụng thư viện scipy trực tiếp, tôi không gặp phải lỗi nào. ví dụ.

import scipy 
print scipy.version 

lợi nhuận

<module 'scipy.version' from 'C:\Python27\lib\site-packages\scipy\version.pyc'> 

Đúng như dự đoán.

Tuy nhiên khi cố gắng nhập khẩu các thư viện thưa thớt như sau:

from scipy import sparse 

tôi nhận được:

ImportError: DLL load failed: %1 is not a valid Win32 application. 

Đáng buồn là kiến ​​thức của tôi còn hạn chế và tôi dường như không thể tìm ra giải pháp phù hợp. Gần nhất là tôi đã cài đặt sai thư viện, tuy nhiên tôi không thể thấy lý do tại sao điều này sẽ xảy ra nếu thư viện scipy gốc hoạt động chính xác.

Có ai biết giải pháp cho điều này không? Hoặc nó sẽ là tốt hơn để sử dụng một trong các gói python cho các cửa sổ với scipy cài đặt trực tiếp?

Cảm ơn

chỉnh sửa:

Đây là traceback từ lỗi:

Traceback (most recent call last): 
    File "C:\Users\Piers\Documents\Physics\PhD\Code\Far Time Crank-Nicholson\FarTimeCrankNicholson.py", line 16, in <module> 
    from scipy import sparse 
    File "C:\Python27\lib\site-packages\scipy\sparse\__init__.py", line 182, in <module> 
    from .csr import * 
    File "C:\Python27\lib\site-packages\scipy\sparse\csr.py", line 15, in <module> 
    from .sparsetools import csr_tocsc, csr_tobsr, csr_count_blocks, \ 
    File "C:\Python27\lib\site-packages\scipy\sparse\sparsetools\__init__.py", line 5, in <module> 
    from .csr import * 
    File "C:\Python27\lib\site-packages\scipy\sparse\sparsetools\csr.py", line 26, in <module> 
    _csr = swig_import_helper() 
    File "C:\Python27\lib\site-packages\scipy\sparse\sparsetools\csr.py", line 22, in swig_import_helper 
    _mod = imp.load_module('_csr', fp, pathname, description) 
ImportError: DLL load failed: %1 is not a valid Win32 application. 
+1

Vấn đề thường gặp ở đây là một cái gì đó 'scipy.sparse' phụ thuộc vào (hoặc là" nhập 'Python, hoặc dưới dạng DLL C) bị hỏng/sai (ví dụ: 32 bit .pyd thay vì một bit 64 bit). Thật không may, vì một hạn chế trong logic nhập của Python 2.7, rất khó để nói điều gì (trong trường hợp đầu tiên, truy nguyên có thể cho bạn biết - và bạn luôn phải đăng tải lại hoàn toàn - nhưng trong trường hợp thứ hai, có không có thêm thông tin để có). – abarnert

+0

Đã thử cài đặt C++ Redistribute, thật đáng buồn là không hoạt động. Chúc mừng cho đề nghị mặc dù! –

+0

Có phải đó là 'scipy0.12.0-amd64-py27' từ trang web [Christoph Gohlke] (http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy), hoặc cái gì đó khác? – abarnert

Trả lời

5

Cuối cùng, điều này có nghĩa rằng scipy.sparse chính nó, hoặc một cái gì đó nó nhập khẩu, hoặc là, hoặc phụ thuộc vào tại thời gian tải, tệp .DLL hoặc .pyd bị hỏng hoặc do kiến ​​trúc sai.

Vì vậy, có hai bước để theo dõi điều này.


Trước tiên, bạn cần tìm ra tệp .pyd/.DLL thực tế đang tăng ngoại lệ này. Thật không may, Python 2.7 sẽ không cung cấp cho bạn thông tin này trực tiếp.

Bạn có thể tìm ra bằng cách nhìn vào truy nguyên từ ImportError —nó phải là một cái gì đó import được sửa bởi mô-đun thấp nhất trong chuỗi. (Nếu bạn không hiểu truy nguyên, hãy dán nó vào câu trả lời của bạn, và hy vọng một người khác có thể cho bạn biết.)

Nếu không, bạn sẽ phải đi qua mọi thứ theo cách thủ công. Bạn có thể xem mã nguồn theo số scipy/sparse/__init__.py trong gói trang web của mình hoặc online in the repository để xem nó hoạt động như thế nào, sau đó thử từng số một import. Khi bạn tìm thấy lỗi không thành công, hãy xem mã nguồn của bạn, v.v. cho đến khi bạn đến cuối cây.

Bây giờ bạn đã dán traceback, chúng ta có thể nói từ phần này:

File "C:\Python27\lib\site-packages\scipy\sparse\sparsetools\csr.py", line 22, in swig_import_helper 
    _mod = imp.load_module('_csr', fp, pathname, description) 

... mà vấn đề là scipy.sparse.csr, aka scipy/sparse/csr.py được không tải scipy.sparse._csr, đó là gần như chắc chắn một file có tên giống như _csr.dll hoặc _csr.pyd và một nơi nào đó bên trong thư mục scipy. Chính xác có thể hơi phức tạp, vì mã đang gọi imp.load_module với tên đường dẫn tùy chỉnh thay vì sử dụng câu lệnh import đơn giản ... nhưng việc tìm kiếm không quá khó. (Nếu bạn gặp khó khăn, bạn luôn có thể chỉnh sửa tạm thời csr.py thành print tên đường dẫn trước khi chuyển nó đến load_module.)

Vì vậy, đó là thư viện mà bạn cần kiểm tra.


Bây giờ, bạn thực sự có trách nhiệm, có hai khả năng.

Thứ nhất, nó có thể tự bị phá vỡ, hoặc cho kiến ​​trúc sai (ví dụ, 32-bit thay vì 64-bit), vv

Nếu không, nếu phải liên kết chống lại một .dll đó là bị hỏng hoặc cho kiến trúc sai.

Công cụ Dependency Walker có thể cho bạn biết một DLL là 32- hoặc 64-bit, cho dù nó bị hỏng quá nặng để tải, vv Và nó cũng có thể cung cấp cho bạn danh sách tất cả các DLL mà thư viện tự phụ thuộc, mà sau đó bạn có thể kiểm tra cho đến khi bạn tìm thấy vấn đề.


Trong khi đó, nếu bạn đang tự hỏi làm thế nào bạn đã vào tình trạng này ở nơi đầu tiên ...

Cài đặt gói Python nhị phân trên Windows thường không cài đặt các phụ thuộc mà họ cần, hoặc phát hiện rằng họ đang thiếu - đặc biệt là các phụ thuộc không phải Python. Vì vậy, bạn không thấy vấn đề cho đến khi bạn cố gắng sử dụng một số phần của mã yêu cầu những phụ thuộc đó. Christoph Gohkle's thực hiện một công việc tuyệt vời để giảm thiểu những vấn đề này (thường chỉ cần cài đặt MSVC thích hợp redistributable, và phiên bản Numpy-MKL của numpy, là tất cả những gì bạn cần), nhưng có giới hạn.

the scipy website explains, việc tải xuống "phân phối Python khoa học" như Anaconda hoặc Enthought dễ dàng hơn rất nhiều. Hoặc, cách khác, nếu bạn cài đặt từ nguồn — ví dụ, thông qua pip —bạn sẽ phải có tất cả các điều kiện tiên quyết được thiết lập đúng, hoặc quá trình cài đặt sẽ không thành công sớm và cho bạn biết có gì sai. (Đôi khi nó hơi khó hiểu - ví dụ, nếu bạn đang sử dụng gcc toolchain nhưng không cài đặt gfortran, thông báo lỗi chỉ cho bạn biết điều gì đó về việc không biên dịch config.f… nhưng ít nhất đó là thứ bạn có thể tìm kiếm hoặc đăng trên SO và nhận câu trả lời ngay lập tức.)

+0

Cảm ơn bạn đã trả lời nhanh. Tôi đã đính kèm theo dõi ở đây. Thông thường, tôi ổn khi theo dõi các dấu vết, nhưng điều này làm tôi bối rối vì dòng cuối cùng không phải là một sự nhập khẩu. Tôi không tin đó là nhập .csr. Tuy nhiên một số dòng trước đó trong mã là một tuyên bố "imp nhập", có thể là dòng mã vi phạm. Bạn có đồng ý không? –

+0

@PiersLillystone: Nó không phải là 'imp nhập khẩu '; đó là 'imp.load_module ('_ csr',…)'. Đó là một cách phức tạp để thực hiện tương đương với 'import _csr', nhưng ghi đè nhiều thứ khác nhau để chỉ định một tên đường dẫn thay vì để Python tìm nó một cách bình thường. – abarnert

+1

Hài hước bạn nên nói rằng bởi vì nó có vẻ như đây là một tính năng python 2.6.0+. Nếu phiên bản dưới 2.6.0, mã sẽ thực thi 'import _csr'. –