2009-07-31 43 views
6

Có cách nào để tập lệnh python tự động phát hiện xem nó đang được chạy tương tác hay không? Ngoài ra, người ta có thể phát hiện xem ipython đang được sử dụng so với python c thường xuyên thực thi?Phát hiện khi một tập lệnh python đang được chạy tương tác trong ipython

Bối cảnh: Tập lệnh python của tôi thường có lệnh gọi exit() trong đó. Theo thời gian, tôi chạy các kịch bản tương tác để gỡ lỗi và lược tả, thường là trong ipython. Khi tôi đang chạy tương tác, tôi muốn chặn các cuộc gọi để thoát.

Làm rõ:

Giả sử tôi có một kịch bản, myscript.py, trông giống như:

#!/usr/bin/python 
...do useful stuff... 
exit(exit_status) 

Đôi khi, tôi muốn chạy các kịch bản trong một phiên IPython mà tôi đã bắt đầu , nói điều gì đó như:

In [nnn]: %run -p -D myscript.pstats myscript.py 

Ở cuối tập lệnh, lệnh exit() sẽ khiến ipython treo trong khi đó trượt tôi nếu tôi thực sự muốn thoát. Đây là một sự khó chịu nhỏ trong khi gỡ rối (quá nhỏ để tôi quan tâm), nhưng nó có thể làm hỏng kết quả lược tả: dấu nhắc thoát được đưa vào kết quả hồ sơ (làm cho phân tích khó hơn nếu tôi bắt đầu một phiên lược tả trước khi đi ăn trưa) .

Những gì tôi muốn là một cái gì đó cho phép tôi thay đổi kịch bản của tôi vì vậy nó trông giống như:

#!/usr/bin/python 
...do useful stuff... 
if is_python_running_interactively(): 
    print "The exit_status was %d" % (exit_status,) 
else: 
    exit(exit_status) 

Trả lời

13

tôi stumbed trên sau đây và nó dường như làm các trick cho tôi:

def in_ipython(): 
    try: 
     __IPYTHON__ 
    except NameError: 
     return False 
    else: 
     return True 
+0

vỏ tương tác chuẩn mà bạn có với 'python' là gì? – n611x007

2

Khi gọi một cách tương tác, trăn sẽ chạy kịch bản trong $ PYTHONSTARTUP, vì vậy bạn chỉ có thể có mà biến môi trường gọi một kịch bản mà lập một toàn cầu

3

Documents nói rằng sys.ps1 không tồn tại ở chế độ không tương tác. Ngoài ra, người ta có thể sử dụng sys.flags (đối với python 2.6+) để phát hiện nếu chúng tôi đã sử dụng python -i <whatever>.

Kịch bản này phát hiện nếu chúng tôi chạy tương tác, không tương tác và trong chế độ sau khi chết (có thể được quy cho chế độ tương tác nếu trình thông dịch python được gọi là sử dụng python -i ngầm và người dùng cho rằng anh ta đã truy cập vào bảng điều khiển "tương tác"):

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import sys 

# IPython recognition is missing; test here if __IPYTHON__ exists, etc. 

if hasattr(sys, 'ps1'): 
    print "Running interactively." 
else: 
    print "Not running interactively..." 
    if sys.flags.interactive: 
     print "... but I'm in interactive postmortem mode." 

Hỗ trợ IPython có thể được thêm vào như mô tả của Mr Fooz.

+0

Điều này sai trong giao diện điều khiển PyCharm. –

Các vấn đề liên quan