detect interactivity

Roald de Vries rdv at roalddevries.nl
Wed Dec 30 07:25:12 EST 2009


On Dec 30, 2009, at 4:10 AM, Steve Holden wrote:
> Roald de Vries wrote:
>>
>> On Dec 30, 2009, at 2:28 AM, Dave Angel wrote:
>>
>>> Roald de Vries wrote:
>>>> On Dec 29, 2009, at 8:34 PM, Dave Angel wrote:
>>>>> Antoine Pitrou wrote:
>>>>>> Le Tue, 29 Dec 2009 16:09:58 +0100, Roald de Vries a écrit :
>>>>>>
>>>>>>
>>>>>>> Dear all,
>>>>>>>
>>>>>>> Is it possible for a Python script to detect whether it is  
>>>>>>> running
>>>>>>> interactively? It can be useful for e.g. defining functions  
>>>>>>> that are
>>>>>>> only useful in interactive mode.
>>>>>>>
>>>>>>
>>>>>> Try the isatty() method (*) on e.g. stdin:
>>>>>>
>>>>>> $ python -c "import sys; print sys.stdin.isatty()"
>>>>>> True
>>>>>> $ echo "" | python -c "import sys; print sys.stdin.isatty()"
>>>>>> False
>>>>>>
>>>>> Your test determines whether input is redirected.  But I think the
>>>>> OP was asking how to detect whether the script was being run  
>>>>> from an
>>>>> interpreter prompt.
>>>>
>>>> That was my question indeed. Is it possible?
>>>>
>>>>
>>> If I had had a good answer, I would have supplied it in my earlier
>>> message.
>>>
>>> The sneaky answer would be that a script cannot be used  
>>> interactively,
>>> as once you import it from the interpreter, it's a module, not a
>>> script.  So you can detect that it's not a script, by examing  
>>> __name__
>>> in the usual way.  If it's a script, it'll have a value of  
>>> "__main__".
>>>
>>> But that won't tell you if you're running inside an IDE, or using  
>>> the
>>> -i switch on the Python command line, or probably a bunch of other
>>> questions.  I don't know of any "correct" answer, and I'm not sure
>>> what the real use case is for knowing.  Are you really going to
>>> somehow define a different set of functions???
>>
>> I'm using a database, and want to use python interactively to  
>> manipulate
>> it. On the other hand, I also want to be able to use it
>> non-interactively. In that case, it would be a waste of CPU to load  
>> the
>> function/class definitions meant for interactive use.
>>
> This is an extreme case of premature optimization. Write the code and
> run it. Do you have any idea how much extra time and memory loading  
> the
> additional code will require? If not, it's a waste of your time to  
> even
> think about omitting the stuff required for interactive use.
>
> Once you get a handle on the structures and functions required for
> interactive vs. non-interactive use you can consider refactoring the
> code so that the non-interactive programs don't need to import the  
> stuff
> that's exclusively for interactive use. But frankly I wouldn't waste
> your time.

Actually, performance is not much if an issue for what I want to do;  
it's mainly interest in 'how should I do this in general'.  I'll just  
leave in all the code, and if it becomes a real issue, I'll separate  
the code over an interactive and a non-interactive script. Thanks for  
your inputs.




More information about the Python-list mailing list