2009-06-08 15 views
6

là có cách để tìm hiểu từ bên trong chương trình python nếu nó được khởi động trong thiết bị đầu cuối hoặc ví dụ: trong một động cơ hàng loạt như động cơ lưới mặt trời?python: tìm hiểu xem có đang chạy trong trình bao hay không (ví dụ: hàng đợi động cơ lưới mặt trời)

ý tưởng là quyết định in một số thanh tiến trình và các công cụ tương tác ascii khác hoặc không.

cảm ơn!

p.

+0

Chào mừng đến với trang web, Pavel. Nếu bất kỳ câu trả lời nào dưới đây giải quyết được vấn đề của bạn, bạn có thể muốn chính thức chấp nhận câu trả lời mà bạn cảm thấy cung cấp câu trả lời hay nhất; người trả lời nhận được thêm một vài điểm, và nó giúp khách truy cập trong tương lai xác định giải pháp tốt nhất. –

+0

bằng cách này, những gì về chạy 'printenv' trong một công việc và xem các biến môi trường được thiết lập bởi Sun Grid Engine (chẳng hạn như số công việc) mà không được thiết lập trong một vỏ tương tác điển hình? –

+0

Có thể trùng lặp [Kiểm tra vỏ tương tác trong tập lệnh Python] (https://stackoverflow.com/questions/6108330/checking-for-interactive-shell-in-a-python-script) – ideasman42

Trả lời

13

Cách tiêu chuẩn là isatty().

import sys 
if sys.stdout.isatty(): 
    print("Interactive") 
else: 
    print("Non-interactive") 
+0

cảm ơn bạn rất nhiều, hoạt động đúng như dự định! chính xác những gì tôi tìm kiếm. p. –

6

Bạn có thể sử dụng os.getppid() để tìm ra id quá trình cho quy trình gốc của quy trình này và sau đó sử dụng id tiến trình đó để xác định chương trình đang xử lý đang chạy. Một cách hữu ích hơn, bạn có thể sử dụng sys.stdout.isatty() - không trả lời câu hỏi tiêu đề của bạn nhưng có vẻ giải quyết tốt hơn vấn đề thực tế bạn giải thích (nếu bạn đang chạy dưới trình bao nhưng đầu ra của bạn được chuyển đến một quy trình khác hoặc chuyển hướng đến một tệp có thể bạn không muốn phát ra "nội dung tương tác" trên đó).

+0

cảm ơn bạn đã giải thích, Alex! điều đó giúp tôi rất nhiều! p. –

+0

@pavel, cảm ơn vì đã cho tôi biết, phản hồi luôn hữu ích! –

2

tôi đã tìm thấy những điều sau đây để làm việc trên cả Linux và Windows, trong cả hai người phiên dịch bình thường Python và IPython (mặc dù tôi không thể nói về IronPython):

isInteractive = hasattr(sys, 'ps1') or hasattr(sys, 'ipcompleter') 

Tuy nhiên, lưu ý rằng khi sử dụng ipython, nếu tệp được chỉ định làm đối số dòng lệnh, nó sẽ chạy trước khi trình thông dịch trở nên tương tác. Thấy những gì tôi có ý nghĩa dưới đây:

C:\>cat C:\demo.py 
import sys, os 

# ps1=python shell; ipcompleter=ipython shell 
isInteractive = hasattr(sys, 'ps1') or hasattr(sys, 'ipcompleter') 
print isInteractive and "This is interactive" or "Automated" 

C:\>python c:\demo.py 
Automated 

C:\>python 
>>> execfile('C:/demo.py') 
This is interactive 

C:\>ipython C:\demo.py 
Automated  # NOTE! Then ipython continues to start up... 

IPython 0.9.1 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object'. ?object also works, ?? prints more. 

In [2]: run C:/demo.py 
This is interactive # NOTE! 

HTH

3

Hơi ngắn:

import sys 

sys.stdout.isatty() 
Các vấn đề liên quan