2017-09-26 30 views
8

Tôi có chương trình Python 3.5 64 bit (yêu cầu bởi tensorflow cho Windows) sử dụng OpenCV. Tôi đang phân phối nó với pyinstaller.Pyinstaller phân phối opencv từ Windows 10 đến Windows <10, thiếu tập tin ucrt api-ms-win-crt

tôi đã xây dựng chương trình của tôi với Windows 10

/c/Python35/Scripts/pyinstaller -c DeepMeerkat.spec 

Trên máy tính của tôi, .exe xây dựng và chạy một cách hoàn hảo. Trên bất kỳ máy không phải là Windows 10 khác

trên

import cv2 

Returns

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

tôi có thể nhìn thấy một số tiền rất lớn của cuộc thảo luận về vấn đề này trên pyInstaller thread, nhưng tôi có thể không hoàn toàn nói như thế nào để đưa nó vào thực tế. Dependency Walker nói rằng tôi đang thiếu một số DLL

api-ms-win-crt-**.dll 

Được rồi, từ chủ đề PyInstaller, tôi biết rằng các DLL tồn tại

C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs 

Theo cơ sở nhiều thư mục con trên kiến ​​trúc.

tôi đã cố gắng thêm vào tập tin .spec tôi

pathex=["C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/"], 

Hoặc cho kiến ​​trúc đặc biệt của tôi

pathex=["C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/arm"], 

Đó là những gì tôi nghĩ đã được đề nghị here

"Install the Windows Software Development Kit (SDK) for Windows 10 and expand the .spec-file to include the required DLLs, see “Distributing Software that uses the Universal CRT“ in the above-mentioned link, number 6."

Đó không có hiệu lực. Tôi nhận được hàng trăm lỗi như

121472 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of c:\python35\DLLs\_ssl.pyd 

Nhưng tôi có thể thấy rằng DLL đây

C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\arm 

enter image description here

Vì vậy, sau đó tôi theo nghĩa đen sao chép posthoc toàn bộ thư mục

cp -r "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/" dist/Lib/ 

Nhưng không rõ cách kết nối chúng với .exe. Rõ ràng, để cho pyInstaller biết trước là thích hợp hơn.

Tôi cũng đã cố gắng

/c/Python35/Scripts/pyinstaller --path "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt/DLLs/arm" -c DeepMeerkat.spec 

Và nó vẫn không tìm thấy chúng

Tôi cũng đã thử thêm thư mục đó vào PATH. Bất kỳ ý tưởng?

+0

Tôi không thể thực hiện tác phẩm này, ngay cả sau khi tìm thấy các dll. Các "giải pháp" là chỉ cần sử dụng trình cài đặt của tôi để cài đặt vcredist_x86.exe trên máy của người dùng, điều này giải quyết nó, mặc dù chúng xuất hiện giống hệt nhau. Có lẽ vấn đề PATH trên máy của người dùng. – bw4sz

+0

Bạn đang sử dụng phiên bản PyInstaller nào? Phiên bản 3.3 được phát hành tháng trước đã sửa một số cho Python> = 3.5 trên Windows 10. – jthetzel

+0

Tôi đã sử dụng nhánh dev trên github theo hướng dẫn của người bảo trì. – bw4sz

Trả lời

1

Tôi cần tự mình làm nhưng chưa thực hiện. Tôi sẽ cố gắng đăng giải pháp đầy đủ của mình khi tôi làm. Trong luc đo...

Tôi nghĩ bạn có thể phải yêu cầu rõ ràng chúng được bao gồm thay vì chỉ mở rộng đường dẫn tìm kiếm.

https://pythonhosted.org/PyInstaller/spec-files.html#adding-binary-files

Có lẽ bằng cách sử dụng lớp Tree họ đề cập để thu thập tất cả các file cho bạn.

https://pythonhosted.org/PyInstaller/advanced-topics.html#the-tree-class

1

Nếu bạn đã cung cấp file spec của bạn tôi có thể nhìn thấy những gì đang xảy ra. Từ đây có khả năng bạn không bao gồm các tập tin.

Có hai phương pháp để đi từ đây:

  1. Tạo "một" tập tin duy nhất mà bao gồm tất cả của dll, file pyd và nhiều hơn nữa ... một lớn exe-file kết quả.
  2. Cách khác là đặt tệp đó làm thư mục + tệp chứa đầy dll, v.v. bạn sẽ có một tệp exe nhỏ.

Kiểm tra add binary (incl. dll) files here tài liệu pyinstaller về cách bao gồm tệp theo cách thủ công.

Kiểm tra add data files here tài liệu pyinstaller về việc bao gồm tệp theo cách thủ công.

Ví dụ về tệp đặc tả bao gồm các tệp dll từ thư mục dll của bạn.

block_cipher = None a = Analysis(['minimal.py'], pathex = ['/Developer/PItests/minimal'], binaries = [ ('C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs', '.') ], datas = [ ('helpmod/help_data.txt', 'helpmod') ], hiddenimports = [], hookspath = None, runtime_hooks = None, excludes = None, cipher = block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher = block_cipher) exe = EXE(pyz,...) coll = COLLECT(...)

1

Tôi đã nhìn thấy PyInstaller và py2exe thất bại trong việc đón dlls không biết bao nhiêu lần. Cá nhân tôi đã sử dụng chúng theo lô hoặc bash vì một số lý do để mở rộng những gì họ làm. Về mặt logic, tôi thấy một đối số để gói chúng trong các bản thân py ...

Dù sao, có thể dễ dàng sao chép các phụ thuộc vào gói cài đặt của bạn thông qua một tập lệnh bao bọc chứ không phải chiến đấu với điều này.

Thông thường, bạn sẽ gặp phải lỗi dll bị thiếu khi bạn cố gắng chạy một số nội dung bị thiếu. Thêm từng người theo cách thủ công vào thư mục, lưu ý những gì bạn cần đưa vào chính mình. Sau đó, kịch bản đó.

Các vấn đề liên quan