Python trên Windows FAQ¶
Làm cách nào để chạy chương trình Python trong Windows?¶
Đây không hẳn là một câu hỏi đơn giản. Nếu bạn đã quen với việc chạy các chương trình từ dòng lệnh Windows thì mọi thứ sẽ có vẻ hiển nhiên; nếu không, bạn có thể cần thêm một chút hướng dẫn.
Trừ khi bạn sử dụng một số loại môi trường phát triển tích hợp, bạn sẽ kết thúc các lệnh Windows typing vào cái được gọi là "Cửa sổ nhắc lệnh". Thông thường, bạn có thể tạo một cửa sổ như vậy từ thanh tìm kiếm bằng cách tìm kiếm cmd. Bạn có thể nhận biết khi nào bạn khởi động một cửa sổ như vậy vì bạn sẽ thấy "dấu nhắc lệnh" của Windows. Cửa sổ này thường trông giống như sau:
C:\>
Bức thư có thể khác và có thể có những thứ khác sau nó, vì vậy bạn có thể dễ dàng thấy những nội dung như:
D:\YourName\Projects\Python>
tùy thuộc vào cách máy tính của bạn được thiết lập và những gì bạn đã làm gần đây với nó. Khi bạn đã khởi động một cửa sổ như vậy, bạn đã sẵn sàng chạy các chương trình Python.
Bạn cần nhận ra rằng các tập lệnh Python của bạn phải được xử lý bởi một chương trình khác có tên là Python interpreter. Trình thông dịch đọc tập lệnh của bạn, biên dịch nó thành mã byte và sau đó thực thi mã byte để chạy chương trình của bạn. Vậy bạn sắp xếp thế nào để trình thông dịch xử lý Python của bạn?
Trước tiên, bạn cần đảm bảo rằng cửa sổ lệnh của bạn nhận ra từ "py" là hướng dẫn khởi động trình thông dịch. Nếu bạn đã mở một cửa sổ lệnh, bạn nên thử nhập lệnh py và nhấn return:
C:\Users\Tên bạn> py
Sau đó bạn sẽ thấy một cái gì đó như:
Python 3.6.4 (v3.6.4:d48eceb, ngày 19 tháng 12 năm 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] trên win32
Nhập "trợ giúp", "bản quyền", "tín dụng" hoặc "giấy phép" để biết thêm thông tin.
>>>
Bạn đã khởi động trình thông dịch ở "chế độ tương tác". Điều đó có nghĩa là bạn có thể nhập các câu lệnh hoặc biểu thức Python một cách tương tác và thực thi hoặc đánh giá chúng trong khi chờ đợi. Đây là một trong những tính năng mạnh nhất của Python. Kiểm tra nó bằng cách nhập một vài biểu thức bạn chọn và xem kết quả:
>>> in("Xin chào")
xin chào
>>> "Xin chào" * 3
'Xin chàoXin chàoXin chào'
Nhiều người sử dụng chế độ tương tác như một máy tính tiện lợi nhưng có khả năng lập trình cao. Khi bạn muốn kết thúc phiên Python tương tác của mình, hãy gọi hàm exit() hoặc giữ phím Ctrl trong khi nhập Z, sau đó nhấn phím "Enter" để quay lại dấu nhắc lệnh Windows của bạn.
Bạn cũng có thể thấy rằng bạn có một mục trong menu Bắt đầu, chẳng hạn như , dẫn đến việc bạn nhìn thấy lời nhắc >>> trong một cửa sổ mới. Nếu vậy, cửa sổ sẽ biến mất sau khi bạn gọi hàm exit() hoặc nhập ký tự Ctrl-Z; Windows đang chạy một lệnh "python" trong cửa sổ và đóng lệnh này khi bạn kết thúc trình thông dịch.
Bây giờ chúng ta đã biết lệnh py đã được nhận dạng, bạn có thể cung cấp tập lệnh Python của mình cho lệnh đó. Bạn sẽ phải cung cấp đường dẫn tuyệt đối hoặc tương đối cho tập lệnh Python. Giả sử tập lệnh Python của bạn nằm trên màn hình của bạn và được đặt tên là hello.py, đồng thời dấu nhắc lệnh của bạn được mở dễ dàng trong thư mục chính nên bạn sẽ thấy nội dung tương tự như:
C:\Users\Tên bạn>
Vì vậy, bây giờ bạn sẽ yêu cầu lệnh py cung cấp tập lệnh của bạn cho Python bằng cách nhập py theo sau là đường dẫn tập lệnh của bạn:
C:\Users\YourName> py Desktop\hello.py
xin chào
Làm cách nào để tạo các tập lệnh Python có thể thực thi được?¶
Trên Windows, trình cài đặt Python tiêu chuẩn đã liên kết phần mở rộng .py với một loại tệp (Python.File) và cung cấp cho loại tệp đó một lệnh mở để chạy trình thông dịch (D:\Program Files\Python\python.exe "%1" %*). Điều này đủ để làm cho các tập lệnh có thể thực thi được từ dấu nhắc lệnh dưới dạng 'foo.py'. Nếu bạn muốn có thể thực thi tập lệnh bằng cách gõ đơn giản 'foo' không có phần mở rộng, bạn cần thêm .py vào biến môi trường PATHEXT.
Tại sao Python đôi khi mất nhiều thời gian để bắt đầu?¶
Thông thường Python khởi động rất nhanh trên Windows, nhưng đôi khi có những báo cáo lỗi rằng Python đột nhiên khởi động mất nhiều thời gian hơn. Điều này càng trở nên khó hiểu hơn vì Python sẽ hoạt động tốt trên các hệ thống Windows khác có cấu hình giống hệt nhau.
Sự cố có thể xảy ra do cấu hình sai phần mềm kiểm tra vi-rút trên máy gặp sự cố. Một số máy quét vi-rút đã được biết là gây ra chi phí khởi động ở mức hai bậc khi máy quét được cấu hình để giám sát tất cả các lần đọc từ hệ thống tệp. Hãy thử kiểm tra cấu hình phần mềm quét vi-rút trên hệ thống của bạn để đảm bảo rằng chúng thực sự được cấu hình giống hệt nhau. McAfee, khi được định cấu hình để quét tất cả hoạt động đọc hệ thống tệp, là một kẻ phạm tội cụ thể.
Làm cách nào để tạo tệp thực thi từ tập lệnh Python?¶
Xem Làm cách nào tôi có thể tạo tệp nhị phân độc lập từ tập lệnh Python? để biết danh sách các công cụ có thể được sử dụng để tạo tệp thực thi.
Tệp *.pyd có giống với tệp DLL không?¶
Đúng, tệp .pyd là tệp dll, nhưng có một số điểm khác biệt. Nếu bạn có DLL có tên foo.pyd thì nó phải có chức năng PyInit_foo(). Sau đó, bạn có thể viết Python "import foo" và Python sẽ tìm kiếm foo.pyd (cũng như foo.py, foo.pyc) và nếu tìm thấy nó, nó sẽ cố gắng gọi PyInit_foo() để khởi tạo nó. Bạn không liên kết .exe của mình với foo.lib, vì điều đó sẽ khiến Windows yêu cầu DLL phải có mặt.
Lưu ý rằng đường dẫn tìm kiếm foo.pyd là PYTHONPATH, không giống với đường dẫn Windows sử dụng để tìm kiếm foo.dll. Ngoài ra, foo.pyd không cần phải có mặt để chạy chương trình của bạn, trong khi nếu bạn liên kết chương trình của mình với một dll thì dll đó là bắt buộc. Tất nhiên, foo.pyd là bắt buộc nếu bạn muốn nói import foo. Trong DLL, liên kết được khai báo trong mã nguồn với __declspec(dllexport). Trong .pyd, liên kết được xác định trong danh sách các hàm có sẵn.
Làm cách nào tôi có thể nhúng Python vào ứng dụng Windows?¶
Việc nhúng trình thông dịch Python vào ứng dụng Windows có thể được tóm tắt như sau:
not có xây dựng trực tiếp Python vào tệp .exe của bạn không. Trên Windows, Python phải là DLL để xử lý việc nhập các mô-đun chính là DLL. (Đây là thông tin quan trọng đầu tiên không có giấy tờ.) Thay vào đó, hãy liên kết tới
pythonNN.dll; nó thường được cài đặt trongC:\Windows\System. NN là phiên bản Python, một số chẳng hạn như "33" cho Python 3.3.Bạn có thể liên kết với Python theo hai cách khác nhau. Liên kết trong thời gian tải có nghĩa là liên kết với
pythonNN.lib, trong khi liên kết trong thời gian chạy có nghĩa là liên kết vớipythonNN.dll. (Lưu ý chung:pythonNN.libđược gọi là "lib nhập" tương ứng vớipythonNN.dll. Nó chỉ xác định các ký hiệu cho trình liên kết.)Liên kết trong thời gian chạy giúp đơn giản hóa đáng kể các tùy chọn liên kết; mọi thứ xảy ra vào thời gian chạy. Mã của bạn phải tải
pythonNN.dllbằng quy trìnhLoadLibraryEx()của Windows. Mã này cũng phải sử dụng các quy trình truy cập và dữ liệu trongpythonNN.dll(nghĩa là C API của Python) bằng cách sử dụng các con trỏ thu được từ quy trìnhGetProcAddress()của Windows. Macro có thể làm cho việc sử dụng các con trỏ này trở nên trong suốt đối với bất kỳ mã C nào gọi các thủ tục trong C API của Python.Nếu bạn sử dụng SWIG, bạn có thể dễ dàng tạo một "mô-đun mở rộng" Python để cung cấp dữ liệu và phương thức của ứng dụng cho Python. SWIG sẽ xử lý hầu hết các chi tiết khó chịu cho bạn. Kết quả là mã C mà bạn liên kết into tệp .exe của bạn (!) Bạn not phải tạo một tệp DLL và điều này cũng giúp đơn giản hóa việc liên kết.
SWIG sẽ tạo một hàm init (hàm C) có tên phụ thuộc vào tên của mô-đun mở rộng. Ví dụ: nếu tên mô-đun là leo thì hàm init sẽ được gọi là initleo(). Nếu bạn sử dụng các lớp bóng SWIG, thì hàm init sẽ được gọi là initleoc(). Điều này khởi tạo một lớp trợ giúp hầu như bị ẩn được sử dụng bởi lớp bóng.
Lý do bạn có thể liên kết mã C ở bước 2 vào tệp .exe của mình là vì việc gọi hàm khởi tạo tương đương với việc nhập mô-đun vào Python! (Đây là sự thật không có giấy tờ quan trọng thứ hai.)
Nói tóm lại, bạn có thể sử dụng đoạn mã sau để khởi tạo trình thông dịch Python bằng mô-đun mở rộng của mình.
#include <Python.h> ... Py_Initialize(); // Khởi tạo Python. initmyAppc(); // Khởi tạo (nhập) lớp trợ giúp. PyRun_SimpleString("nhập myApp"); // Nhập lớp bóng.
Có hai vấn đề với C API của Python. Vấn đề này sẽ trở nên rõ ràng nếu bạn sử dụng trình biên dịch khác MSVC, trình biên dịch được sử dụng để xây dựng pythonNN.dll.
Vấn đề 1: Cái gọi là hàm "Mức rất cao" lấy đối số
FILE *sẽ không hoạt động trong môi trường nhiều trình biên dịch vì khái niệmstruct FILEcủa mỗi trình biên dịch sẽ khác nhau. Từ quan điểm triển khai, đây là những hàm cấp độ rất thấp.Vấn đề 2: SWIG tạo mã sau khi tạo trình bao bọc cho các hàm void:
Py_INCREF(Py_None); _resultobj = Py_None; trả về _resultobj;
Than ôi, Py_None là macro mở rộng thành tham chiếu đến cấu trúc dữ liệu phức tạp có tên _Py_NoneStruct bên trong pythonNN.dll. Một lần nữa, mã này sẽ thất bại trong môi trường nhiều trình biên dịch. Thay thế mã đó bằng:
trả về Py_BuildValue("");
Có thể sử dụng lệnh
%typemapcủa SWIG để thực hiện thay đổi tự động, mặc dù tôi chưa thể thực hiện được lệnh này (Tôi hoàn toàn là người mới sử dụng SWIG).Sử dụng tập lệnh shell Python để hiển thị cửa sổ trình thông dịch Python từ bên trong ứng dụng Windows của bạn không phải là một ý tưởng hay; cửa sổ kết quả sẽ độc lập với hệ thống cửa sổ của ứng dụng của bạn. Đúng hơn, bạn (hoặc lớp wxPythonWindow) nên tạo một cửa sổ trình thông dịch "gốc". Thật dễ dàng để kết nối cửa sổ đó với trình thông dịch Python. Bạn có thể chuyển hướng đối tượng i/o của Python sang đối tượng _any_ hỗ trợ đọc và ghi, vì vậy tất cả những gì bạn cần là một đối tượng Python (được xác định trong mô-đun mở rộng của bạn) có chứa các phương thức read() và write().
Làm cách nào để ngăn người chỉnh sửa chèn các tab vào nguồn Python của tôi?¶
Zz001zz không khuyến nghị sử dụng tab và hướng dẫn kiểu Python, PEP 8, khuyến nghị 4 khoảng trắng cho mã Python phân tán; đây cũng là mặc định của chế độ python của Emacs.
Trong bất kỳ trình chỉnh sửa nào, việc trộn lẫn các tab và dấu cách là một ý tưởng tồi. MSVC không khác biệt về mặt này và có thể dễ dàng định cấu hình để sử dụng khoảng trắng: Lấy và đối với loại tệp "Mặc định", hãy đặt "Kích thước tab" và "Kích thước thụt lề" thành 4, đồng thời chọn nút radio "Chèn dấu cách".
Python tăng IndentationError hoặc TabError nếu các tab và dấu cách hỗn hợp gây ra sự cố ở khoảng trắng ở đầu. Bạn cũng có thể chạy mô-đun tabnanny để kiểm tra cây thư mục ở chế độ hàng loạt.
Làm cách nào để kiểm tra phím nhấn mà không bị chặn?¶
Sử dụng mô-đun msvcrt. Đây là mô-đun mở rộng tiêu chuẩn dành riêng cho Windows. Nó định nghĩa một hàm kbhit() để kiểm tra xem có gõ bàn phím hay không và getch() nhận một ký tự mà không lặp lại nó.
Làm cách nào để giải quyết lỗi thiếu api-ms-win-crt-runtime-l1-1-0.dll?¶
Điều này có thể xảy ra trên Python 3.5 trở lên khi sử dụng Windows 8.1 trở xuống mà không cài đặt tất cả các bản cập nhật. Trước tiên, hãy đảm bảo hệ điều hành của bạn được hỗ trợ và cập nhật. Nếu điều đó không giải quyết được sự cố, hãy truy cập Microsoft support page để được hướng dẫn cài đặt bản cập nhật C Runtime theo cách thủ công.