Py3: Terminal or browser output?

Chris Rebert clp2 at rebertia.com
Sat Feb 13 15:16:20 EST 2010


On Sat, Feb 13, 2010 at 11:46 AM, Gnarlodious <gnarlodious at gmail.com> wrote:
> Hello, searched all over but no success. I want to have a script
> output HTML if run in a browser and plain text if run in a Terminal.
> In Python 2, I just said this:
>
> if len(sys.argv)==True:

That line doesn't make sense really as it is practically equivalent to:

if len(sys.argv) == 1:

Which, since argv always contains at least 1 element (the program's
name), is essentially checking whether /no/ arguments were passed on
the command line.
Recall that issubclass(bool, int) is true and that True == 1 in Python
due to details of said subclassing.

Note also that "== True" is almost always unnecessary as it is
essentially implicit in the "if".

I suspect you instead meant to write:

if len(sys.argv) > 0:

which for the record can be written more idiomatically as:

if sys.argv: # bool(some_list) is True if some_list is not empty

Which, however, as I explained, is always true since argv is /never/
completely empty, and thus the test is useless. What you probably
*wanted* is:

if len(sys.argv) > 1:

Which is effectively the opposite of my very first code snippet and
checks whether we /were/ passed some arguments on the command line.

> and it seemed to work.

By happy accident I suspect, due to the aforementioned way == works
between bools and ints and probably a logic error in your code.

> Py3 must have broken that by sending a list
> with the path to the script in BOTH the browser and Terminal. Is there
> some newfangled way to determine what is running the script (hopefully
> without a try wrapper)?

How exactly are you running the script *"in"* the browser? Browsers
can only execute JavaScript, not Python. Do you mean you're running it
via a webserver?
If so, there are /several/ possible ways of doing that, please explain
exactly which you are using.

Cheers,
Chris
--
http://blog.rebertia.com



More information about the Python-list mailing list