supervisord
là một hệ thống kiểm soát quy trình, độc lập với Trợ lý tại nhà, cũng chỉ được Trợ lý tại nhà sử dụng [phiên bản được giám sát, hoặc thậm chí có thể không?] Hay tôi đang thiếu ngữ cảnh?
cat /etc/systemd/system/mypython.service
[Unit]
Description=My Python script
[Service]
ExecStart=/usr/bin/python3 /path/to/my/script.py
Restart=always
[Install]
WantedBy=multi-user.target
_EOF_
systemctl daemon-reload
systemctl enable --now mypython
systemctl status mypython
Chúng tôi đã tìm thấy sự cố khiến một số thư viện python như scipy [e. g. import scipy] hoặc bất kỳ thư viện nào xử lý giao diện người dùng [chẳng hạn như matplotlib] cần chạy trong luồng chính. Nếu nó đang được chạy trong luồng nền, nó sẽ bị treo [trong lệnh gọi PyRun_SimpleString[] và không bao giờ quay lại]. Sau khi bị treo, không có cách nào để thực thi thêm bất kỳ tập lệnh python nào ngoại trừ khởi động lại ứng dụng hoàn chỉnh
Có vẻ như có vấn đề với con trăn nhúng mà không có cách nào để khởi động lại con trăn nhúng sau khi nó bị treo trong PyRun_SimpleString[]
Tôi đã thử các cách sau nhưng chúng không hoạt động [dẫn đến vi phạm quyền truy cập, v.v.]
- Khởi tạo lại thông qua Py_FinalizeEx[] và Py_Initialize[]
- Tạo ngắt qua PyThreadState_SetAsyncExc[threadID, PyExc_Exception]
- Sử dụng Py_Exit[0]
- SetKeyboard Interrupt, e. g.
Trạng thái PyGILState_STATE;
state = PyGILState_Ensure[];
PyErr_SetString[PyExc_KeyboardInterrupt, “Abort”];
PyGILState_Release[state]; - Tạo trình thông dịch phụ để thực thi tập lệnh tiếp theo
Có vẻ như một khi trình thông dịch nhúng [chính] bị treo trong PyRun_SimpleString[], không có cách nào để khôi phục mà không cần khởi động lại ứng dụng
Chào Dominik,
Cảm ơn những gợi ý của bạn
Tôi đã kiểm tra IronPython, nó không hoạt động với chúng tôi vì chúng tôi đang sử dụng Python 3. 7 trở lên [mới nhất]. Theo IronPython. net/ Download, Iron python hỗ trợ python 2. 7 và 3. 4 [trong phiên bản xem trước]
Về đề xuất sử dụng đa xử lý của bạn, thực sự đó không phải là giải pháp cho chúng tôi. Chúng tôi cung cấp khả năng nhúng python để người dùng thực thi bất kỳ tập lệnh python nào trong ứng dụng của chúng tôi bằng PyRun_SimpleString[] [Vui lòng xem 1. Nhúng Python vào ứng dụng khác — Python 3. 7. 10 tài liệu]. Chúng tôi không sử dụng đa luồng python để nhúng python. Chủ đề chính [chủ đề giao diện người dùng] và chủ đề nền mà tôi đã đề cập trong bài đăng gốc của mình là
- Nếu chúng ta khởi tạo nhúng nhúng python và chạy PyRun_SimpleString[] trong luồng chính, nó sẽ chặn người dùng sử dụng các chức năng khác [e. g. nhấp vào nút giao diện người dùng] của ứng dụng của chúng tôi cho đến khi tập lệnh python của người dùng thực thi xong
- Nếu chúng ta khởi tạo nhúng python và chạy PyRun_SimpleString[] trong một luồng nền, nó sẽ không chặn người dùng sử dụng các chức năng khác [e. g. nhấp vào nút giao diện người dùng] của ứng dụng của chúng tôi trong khi tập lệnh python của người dùng đang thực thi
Tôi nghĩ rằng vấn đề dường như là không có cách nào để khởi động lại python nhúng mới khi nó bị treo/ở trạng thái lỗi
Như chúng ta đã biết, Python là một ngôn ngữ kịch bản phổ biến bởi tính năng linh hoạt của nó. Trong bài viết này, chúng tôi sẽ viết một tập lệnh Python để khởi động lại máy tính. Hãy bắt đầu với cách khởi động lại hệ thống bằng Python
Ghi chú. Để điều này hoạt động, bạn phải nhập
os library
trong ý tưởng. Nếu bạn không có nó, hãy 'pip install os
' thông qua Dấu nhắc Lệnhnguyên nhân. Vui lòng đảm bảo rằng bạn lưu và đóng tất cả chương trình trước khi chạy mã này trên IDLE, vì chương trình bên dưới sẽ ngay lập tức khởi động lại máy tính của bạn
Tôi đã viết một số tập lệnh Python và triển khai "tự động cập nhật" tập lệnh này, để áp dụng các thay đổi trong thời gian chạy, tôi cần khởi động lại tập lệnh từ chính nó. Những tập lệnh khởi động lại từ chính nó
import sys import os python = sys.executable os.execl[python, python, * sys.argv]Trong hướng dẫn này, chúng ta sẽ xem xét phương pháp khởi động lại hoặc chạy lại chương trình trong Python. Giả sử chúng tôi muốn thêm chức năng khởi động lại chương trình của mình khi người dùng chọn tùy chọn khởi động lại;
Hướng dẫn này sẽ trình bày phương pháp mà chúng ta có thể sử dụng để khởi động lại chương trình từ bên trong chương trình và hủy phiên bản hiện tại của chương trình trong Python. Chúng ta có thể làm như vậy bằng cách sử dụng các phương pháp sau
Khởi động lại Tập lệnh chương trình trong Python bằng hàm
os.execv[]
Hàm
os.execv[path, args]
thực thi chương trình mới bằng cách thay thế quy trình. Nó không xóa bộ đệm, đối tượng tệp và bộ mô tả, vì vậy người dùng cần xóa bộ đệm riêng trước khi gọi hàmos.execv[]
. Hàmos.execv[]
không yêu cầu tham sốimport sys import os python = sys.executable os.execl[python, python, * sys.argv]0 để định vị chương trình thực thiDo đó, để khởi động lại chương trình bằng hàm
os.execv[]
, trước tiên chúng ta cần xóa bộ đệm và bộ mô tả tệp bằng cách sử dụng phương thứcimport sys import os python = sys.executable os.execl[python, python, * sys.argv]2 vàimport sys import os python = sys.executable os.execl[python, python, * sys.argv]3, sau đó gọi phương thứcos.execv[]
. Xem mã ví dụ dưới đây