2013-01-15 41 views
5

Tôi đang cố gọi một tệp thực thi lúc khởi động, sẽ gọi một thực thi khác. Đối với phần đầu tiên, tôi chỉ cần thêm đường dẫn đến tệp thực thi vào HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, hoạt động, tệp thực thi của tôi được gọi khi khởi động.Subprocess.Popen(): ẩn vỏ cmd

Sau đó chứa, trong số những người khác, những dòng này:

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW 
startupinfo.wShowWindow = subprocess.SW_HIDE 
proc = subprocess.Popen(command, startupinfo=startupinfo) 

Tuy nhiên, một tiện ích dòng lệnh (cmd) bật khi máy tính khởi động. Tất cả mọi thứ hoạt động tốt, nhưng nó có thể nhìn thấy thay vì ẩn ... Vì vậy, về cơ bản, làm thế nào để ẩn vỏ lệnh này?

Khi sử dụng ProcessExplorer, tôi đã phân cấp sau:

+ System 
|_ Interrupts 
|_ smss.exe 
    |_ some processes... 
+ explorer.exe 
    |_ some processes... 
|_ MYSCRIPT.EXE 

Dưới đây là trình tự tôi cố gắng để đạt được:

  • tôi có thể tạo một tập tin ISO chứa tất cả các Python thực thi Tôi muốn chạy trên máy ảo. Một trong số họ (master.exe) gọi những người khác.
  • tôi có thể tạo một máy ảo có thể tự động gắn kết sau
  • Các VM, mà đã được chuẩn bị, có một nhiệm vụ theo lịch trình trong đó kêu gọi D:\master.exe
  • master.exe (giữa các nhiệm vụ khác mà không phải là mối quan tâm của chúng tôi ở đây) cho biết thêm giá trị D:\myscript.exe-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • VM khởi động lại
  • D:\myscript.exe được chạy (và nó hoạt động tốt và như đã tham dự), nhưng nó chạy trong dấu nhắc lệnh mà tôi muốn ẩn.
+0

Theo nguyên tắc chung, để ẩn một cửa sổ trình, tôi chạy nó thông qua VBScript (phương pháp .run). Nhưng có vẻ như, python cung cấp cho bạn một cách bản địa. :-) – anishsane

+0

liên quan: [Làm cách nào để ẩn bảng điều khiển khi tôi sử dụng os.system() hoặc subprocess.call()?] (Http://stackoverflow.com/q/7006238/4279) – jfs

Trả lời

3

Đây là một vấn đề điển hình mà các lập trình viên Python gặp phải - và do đó, một giải pháp được cung cấp bởi chính Python. Nó đã được hỏi về SO nhiều lần, ví dụ: here, nhưng đối với bạn, vấn đề phức tạp hơn một chút.

Tất cả về việc bạn có sử dụng python.exe hoặc pythonw.exe để chạy tập lệnh của mình hay không. Đối với cái đầu tiên, một bàn điều khiển được mở ra, cho bàn điều khiển thứ hai thì không.

Khi bạn sử dụng các tập lệnh đã biên dịch, bạn phải thông báo cho "trình biên dịch" phiên bản bạn muốn sử dụng. Giả sử bạn đang sử dụng py2exe, bạn có thể xem this post on SO. Ở đây nó được giải thích chi tiết cách tiến hành.

+0

Điều này chỉ hợp lệ cho cửa sổ bảng điều khiển có liên quan đến quy trình python (cho thấy bạn gỡ lỗi thông tin, v.v.) Nó không liên quan đến việc mở một tiến trình con liên quan đến bàn điều khiển với Popen. Đã kiểm tra nhiều lần rồi. Điều duy nhất bạn có thể làm là làm việc với SHELL = True flag với bất lợi, bạn sẽ không nhận được bất kỳ sự kiểm soát đối với các ngoại lệ/lỗi đến từ tiến trình con. Bạn sẽ không nhận được bất kỳ thông tin nào cả. Ví dụ nếu subprocess không được tải do hệ thống không thể tìm thấy exe trên đĩa, hệ thống sẽ không cho bạn biết. Không phải rất tiện dụng. – Jomme

1

Cửa sổ bảng điều khiển đang được mở có thể thuộc về quá trình Python chạy tập lệnh của bạn. Hiển thị cho chúng tôi mục nhập trong sổ đăng ký đang chạy tập lệnh của bạn.

+2

@NNzz Giá trị là gì của 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run' chạy tệp thực thi đầu tiên của bạn? Vui lòng mô tả chính xác loại thực thi nào bạn có; chúng là các kịch bản Python hoặc các kịch bản Python được biên dịch hay một số kết hợp? –

+0

Chúng là các kịch bản Python mà tôi đã biên dịch thành một tệp thực thi. Giá trị của khóa là 'D: \ myscript.exe', là vị trí thực tế của tệp thực thi mà tôi muốn chạy. Tôi sẽ thêm một số thông tin vào bài đăng của mình để chính xác hơn. –

0

Nếu bạn chạy chương trình bảng điều khiển, Windows sẽ tạo cửa sổ bảng điều khiển. "python.exe" là một chương trình điều khiển.

Nếu bạn không muốn cửa sổ bảng điều khiển, bạn có thể chạy tập lệnh Python bằng "pythonw.exe" thay vì "python.exe".

0

Bạn có thể biên dịch sang định dạng exe. Khi tôi gặp sự cố đó, Tôi đã sử dụng py2exe để biên dịch tệp python thành tệp thực thi vô hình.

Tất cả những gì bạn phải làm là thay đổi thiết lập.tập tin py (được sử dụng để biên dịch), từ

setup(console=['__main__.py'], options={"py2exe":{"includes":["sip"]}}) 

để

setup(windows=['__main__.py'], options={"py2exe":{"includes":["sip"]}}) 
Các vấn đề liên quan