2013-03-01 29 views
9

Tôi đang tạo ứng dụng trong python 3.3 sử dụng thư viện yêu cầu. Khi tôi cố gắng lấy URL có kết nối SSL, tôi muốn xác minh URL đó bằng xác minh = true. Điều này hoạt động hoàn hảo khi chạy các tập lệnh python của tôi.Thư viện yêu cầu: thiếu tệp sau cx_freeze

Khi tôi cố định cùng một tập lệnh mà nó gặp sự cố. Nó bỏ lỡ một cái gì đó và tôi thực sự không thể tìm ra cách để tích hợp nó trong ứng dụng đông lạnh của tôi.

tôi nhận được lỗi sau (mà cũng gây ra các lỗi khác, nhưng tôi không gửi cho họ ở đây):

Traceback (most recent call last): 
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 422, in urlopen 
body=body, headers=headers) 
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 274, in _make_request 
conn.request(method, url, **httplib_request_kw) 
File "C:\Python33-32\lib\http\client.py", line 1049, in request 
self._send_request(method, url, body, headers) 
File "C:\Python33-32\lib\http\client.py", line 1087, in _send_request 
self.endheaders(body) 
File "C:\Python33-32\lib\http\client.py", line 1045, in endheaders 
self._send_output(message_body) 
File "C:\Python33-32\lib\http\client.py", line 890, in _send_output 
self.send(msg) 
File "C:\Python33-32\lib\http\client.py", line 828, in send 
self.connect() 
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 105, in connect 
ssl_version=self.ssl_version) 
File "C:\Python33-32\lib\site-packages\requests\packages\urllib3\util.py", line 281, in ssl_wrap_socket 
context.load_verify_locations(ca_certs) 
FileNotFoundError: [Errno 2] No such file or directory 

Dường như ca_certs là mất tích. Có một tệp gọi là cacert.pem trong thư viện yêu cầu, nhưng tôi không biết đây có phải là tệp bị thiếu hay không và cách nhập tệp vì nó dường như không được tích hợp vào gói đóng băng cuối cùng của tôi.

+0

Các mô-đun yêu cầu tệp riêng biệt (như tệp khóa ở đây) có xu hướng gặp sự cố khi được cố định. Bạn có thể cần chỉnh sửa mã yêu cầu. –

+0

Offcourse đó là một khả năng mà sẽ propably làm việc, nhưng nó sẽ được đẹp hơn nếu tập tin được nhập khẩu vào gói từ thư mục module. Có thể ép buộc tệp cụ thể này được nhập trong quá trình đóng băng không? Có các tính năng nhập có sẵn trong quá trình thiết lập, nhưng tôi không biết cách sử dụng chúng chính xác vì tài liệu chính thức không rõ ràng về điều này. – Ecno92

Trả lời

9

Nhìn vào nguồn yêu cầu, có vẻ như bạn có thể chuyển đường dẫn đến tệp cacert.pem dưới dạng verify=path, thay vì verify=True. Vì vậy, bạn không cần phải sửa đổi yêu cầu cho nó hoạt động.

Bạn có thể chuyển đường dẫn của tệp để bao gồm trong thông số include-files của tùy chọn cx_Freeze (docs). Bạn có thể tìm đường đi từ yêu cầu, vì vậy một cái gì đó như thế này nên làm việc trong setup.py bạn sử dụng để đóng băng nó:

import requests.certs 
build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]} 

#... 
+5

Cảm ơn bạn rất nhiều. Đây là giải pháp sau một thay đổi nhỏ. Phương pháp bạn mô tả là không thể vì CX_Freeze sẽ không chấp nhận đường dẫn tuyệt đối như thế này. Điều quan trọng là sử dụng một tuple nơi bạn lần đầu tiên cung cấp cho các đường dẫn tuyệt đối trong nửa đầu và trong nửa thứ hai đường dẫn đích. Bằng cách này, nó hoạt động bằng cách thiết lập xác minh thành True. Vì vậy, như sau: "include_files": [(requests.certs.where(), 'cacert.pem')] – Ecno92

+0

Cảm ơn.Tôi đã cập nhật câu trả lời để rõ ràng cho bất kỳ ai khác gặp phải vấn đề này. –

4

Như Thomas K nói, bạn cần phải bao gồm nộp chứng chỉ CA nếu bạn bật xác minh.

Tuy nhiên, tôi thấy rằng ít nhất là đối với tôi, requests sẽ tìm kiếm [INSTALL PATH]\library.zip\cacert.pem sẽ không thành công.

Tôi giải quyết nó bằng cách sao chép cacert.pem như mô tả

import requests.certs 
build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]} 

#... 

và quy định đường đi của nó trực tiếp khi thực hiện một yêu cầu:

requests.get(..., verify = '[INSTALL PATH]\cacert.pem') 
+0

Có, và 'INSTALL PATH' có thể được xác định bởi [phương thức được đề xuất để tìm tệp dữ liệu] của cx_freeze (https://cx-freeze.readthedocs.org/en/latest/faq.html#using-data-files) – toefftoefftoeff