
Gọi chương trình bên ngoài từ script NX bằng subprocess: truyền tham số, đọc kết quả, giới hạn thời gian
#Python#Tích hợp#subprocess1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Một số việc nên giao cho chương trình khác: nén file bằng công cụ có sẵn, gọi trình kiểm tra riêng, chạy script tính toán. Python gọi chúng qua subprocess; cần tránh treo NX khi chương trình ngoài chạy mãi.
Gọi chương trình bên ngoài từ script NX…Các bước thực hiện
- Chuẩn bị lệnh. Danh sách đối số, không ghép chuỗi.
- Chạy có giới hạn thời gian. subprocess.run(..., timeout=...).
- Bắt đầu ra. capture_output hoặc stdout/stderr.
- Kiểm tra mã thoát. returncode khác 0 là lỗi.
- Xử lý lỗi. TimeoutExpired, FileNotFoundError.
Code tham khảo (Python)
import subprocess import NXOpen def chay_ngoai(lenh, thoi_gian_toi_da=60): """Chạy lệnh (danh sách đối số). Trả về (thanh_cong, dau_ra, loi).""" try: kq = subprocess.run(lenh, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=thoi_gian_toi_da, universal_newlines=True) except FileNotFoundError: return False, "", "Không tìm thấy chương trình: " + lenh[0] except subprocess.TimeoutExpired: return False, "", "Quá thời gian %d giây" % thoi_gian_toi_da return kq.returncode == 0, kq.stdout, kq.stderr def main(): session = NXOpen.Session.GetSession() lw = session.ListingWindow lw.Open() # Ví dụ an toàn: hiện phiên bản Python hệ thống (thay bằng công cụ của bạn) ok, dau_ra, loi = chay_ngoai(["python", "--version"], thoi_gian_toi_da=10) lw.WriteLine("Thành công: %s" % ok) lw.WriteLine("Đầu ra: %s" % (dau_ra.strip() or loi.strip())) # Ví dụ nén thư mục bằng tar có sẵn trong Windows 10 trở lên ok, dau_ra, loi = chay_ngoai(["tar", "-a", "-c", "-f", "D:/NXLab_xuat/goi.zip", "-C", "D:/NXLab_xuat", "."], 120) lw.WriteLine("Nén zip: %s %s" % ("OK" if ok else "LỖI", loi.strip())) if __name__ == "__main__": main()Giải thích code
- Truyền lệnh dạng danh sách thay vì chuỗi để tránh lỗi dấu cách và tấn công chèn lệnh.
timeoutngăn chương trình ngoài treo làm NX đứng.universal_newlines=Truetrả văn bản thay vì byte.
Lỗi thường gặp
- Không bao giờ dùng
shell=Truevới dữ liệu từ người dùng hay từ file. - Chương trình ngoài mở cửa sổ giao diện chờ người bấm sẽ làm tác vụ treo; chọn công cụ chạy được dạng dòng lệnh.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.