Làm cách nào để bạn khởi động lại tập lệnh python?

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.]

  1. Khởi tạo lại thông qua Py_FinalizeEx[] và Py_Initialize[]
  2. Tạo ngắt qua PyThreadState_SetAsyncExc[threadID, PyExc_Exception]
  3. Sử dụng Py_Exit[0]
  4. SetKeyboard Interrupt, e. g.
    Trạng thái PyGILState_STATE;
    state = PyGILState_Ensure[];
    PyErr_SetString[PyExc_KeyboardInterrupt, “Abort”];
    PyGILState_Release[state];
  5. 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à

  1. 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
    1. 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ệnh

nguyê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àm os.execv[]. Hàm os.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 thi

Do đó, để 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ức

import 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ức os.execv[]. Xem mã ví dụ dưới đây

Chủ Đề