اكتشاف متى يتم تشغيل برنامج نصي بيثون بشكل تفاعلي في ipython

StackOverflow https://stackoverflow.com/questions/1212779

  •  06-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لنص بايثون لاكتشاف ما إذا كان يتم تشغيله بشكل تفاعلي أم لا؟وبدلاً من ذلك، هل يمكن للمرء اكتشاف ما إذا كان يتم استخدام ipython مقابل الإصدار العادي C python القابل للتنفيذ؟

خلفية:تحتوي نصوص بايثون الخاصة بي عمومًا على استدعاء للخروج () بداخلها.من وقت لآخر، أقوم بتشغيل البرامج النصية بشكل تفاعلي لتصحيح الأخطاء والتوصيف، عادةً في ipython.عندما أقوم بالتشغيل بشكل تفاعلي، أريد منع مكالمات الخروج.

إيضاح:

لنفترض أن لدي برنامج نصي، myscript.py، يبدو كالتالي:

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

في بعض الأحيان، أرغب في تشغيل البرنامج النصي خلال جلسة IPython التي بدأتها بالفعل، قائلًا شيئًا مثل:

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

في نهاية البرنامج النصي، سيؤدي استدعاء الخروج () إلى تعليق ipython بينما يسألني عما إذا كنت أرغب حقًا في الخروج.يعد هذا إزعاجًا بسيطًا أثناء تصحيح الأخطاء (بسيط جدًا بالنسبة لي بحيث لا أهتم به)، ولكنه قد يؤدي إلى إفساد نتائج التوصيف:يتم تضمين مطالبة الخروج في نتائج الملف الشخصي (مما يجعل التحليل أكثر صعوبة إذا بدأت جلسة التوصيف قبل الذهاب لتناول الغداء).

ما أريده هو شيء يسمح لي بتعديل البرنامج النصي الخاص بي بحيث يبدو كما يلي:

#!/usr/bin/python
...do useful stuff...
if is_python_running_interactively():
    print "The exit_status was %d" % (exit_status,)
else:
    exit(exit_status)
هل كانت مفيدة؟

المحلول

لقد تعثرت في ما يلي ويبدو أن الحيلة بالنسبة لي:

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

نصائح أخرى

المستندات تقول ذلك sys.ps1 غير موجود في الوضع غير التفاعلي.بالإضافة إلى ذلك، يمكن للمرء أن يستخدم sys.flags (لـ python 2.6+) لاكتشاف ما إذا كنا قد استخدمنا python -i <whatever>.

يكتشف هذا البرنامج النصي ما إذا كنا نعمل بشكل تفاعلي وغير تفاعلي وفي وضع ما بعد الوفاة (والذي قد يعزى إلى الوضع التفاعلي إذا تم استدعاء مترجم بايثون باستخدام python -i ضمنيًا ويعتقد المستخدم أنه وصل إلى وحدة التحكم "التفاعلية":

#!/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.")

يمكن إضافة دعم IPython كما وصفه السيد فوز.

عند استدعائه بشكل تفاعلي، سيعمل بايثون على تشغيل البرنامج النصي في $PYTHONSTARTUP، لذلك يمكنك ببساطة جعل متغير البيئة هذا يستدعي برنامجًا نصيًا يقوم بتعيين برنامج عام

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top