From: TP on
Hi everybody,

I am new to Python, I try to understand how Python treats special
characters. For example, if I execute the following line in a shell
console, I obtain a colored string:

$ python -c "print '\033[30;44m foo \033[0m'"

So, it works.
Some time ago, I have made a lot of shell variables with all possible colors
(with shell functions executed each time I launch a new shell). For
example:

$ echo -e $esc$ColorBlackOnDarkblue foo $esc$ColorReset

gives the same result than the python command above.
To know the corresponding non-interpreted characters, I can use the -n
option of echo:

$ echo -n $esc$ColorBlackOnDarkblue foo $esc$ColorReset
\033[30;44m foo \033[0m

So, it is exactly the string above, as expected.

My problem arises when it comes to get these shell variables ( $esc,
$ColorBlackOnDarkblue, $ColorReset) in a Python script, with os.environ, in
the following 5-line script:

import os
Color = os.environ['ColorBlackOnDarkblue']
ColorReset = os.environ['ColorReset']
Esc = os.environ['esc']
print '%s%s%s%s%s' % (Esc, Color, " foo ", Esc, ColorReset)

Run this script color.py, but after having defined these shell variables in
a shell:

$ export esc="\033"
$ export ColorBlackOnDarkblue="[30;44m"
$ export ColorReset="[0m"

When I execute the Python script, I do not obtain any special character
interpretation in Python:

$ python color.py
\033[30;44m foo \033[0m

Why? What is the problem? Is there any solution?
I really want to get my shell color variables.

Thanks a lot

--
TP (Tribulations Parall�les)

"Allez, Monsieur, allez, et la foi vous viendra." (D'Alembert).
From: Peter Pearson on
On Sun, 06 Jul 2008 23:42:26 +0200, TP <Tribulations(a)Paralleles.invalid> wrote:
>
> $ python -c "print '\033[30;44m foo \033[0m'"
[writes an escape sequence to stdout]

> $ echo -e $esc$ColorBlackOnDarkblue foo $esc$ColorReset
[also writes an escape sequence to stdout]

> $ echo -n $esc$ColorBlackOnDarkblue foo $esc$ColorReset
> \033[30;44m foo \033[0m

[snip, shuffle]
> $ export esc="\033"
> $ export ColorBlackOnDarkblue="[30;44m"
> $ export ColorReset="[0m"
>
> import os
> Color = os.environ['ColorBlackOnDarkblue']
> ColorReset = os.environ['ColorReset']
> Esc = os.environ['esc']
> print '%s%s%s%s%s' % (Esc, Color, " foo ", Esc, ColorReset)
[snip]
> $ python color.py
> \033[30;44m foo \033[0m

The string "\033" is 4 characters long. Your shell variable
"esc" is 4 characters long. Your Python program prints
those four characters. You want it to re-interpret those 4
characters into a single escape character.

One of this group's regular participants can (I hope) tell
us three breathtakingly elegant ways to do that. I'm sorry
I can't.

When you run echo, it recognizes the 4-character "esc" as a
convention for representing a single character, and performs
the re-interpretation for you. When you tell python
"print '\033[30;44m foo \033[0m'", python interprets
the "\033" as a single character.

--
To email me, substitute nowhere->spamcop, invalid->net.
From: TP on
Dennis Lee Bieber wrote:

> Off-hand, I'd probably try first with:
>
> csi = "\033["
>
> and then define your
>
> colorblackondarkblue = $csi"30;44m"

Thanks for your answer.
I have tried this slight modification, but it does not change anything on my
terminal.


--
TP (Tribulations Parall�les)

"Allez, Monsieur, allez, et la foi vous viendra." (D'Alembert).
From: TP on
Peter Pearson wrote:

Thanks for your answer.

> When you run echo, it recognizes the 4-character "esc" as a
> convention for representing a single character, and performs
> the re-interpretation for you. When you tell python
> "print '\033[30;44m foo \033[0m'", python interprets
> the "\033" as a single character.

So, the python print command *can* interpret these 4-character as a single
character. It would be odd if there were no possibility to do the same
thing when the characters are (i) stored in a python variable, or (ii) come
from the environment variables. Does anybody know any way to re-interpret a
string in Python? I have tried to play with "eval" (as in bash), but it
does not yield anything.

--
TP (Tribulations Parall�les)

"Allez, Monsieur, allez, et la foi vous viendra." (D'Alembert).
From: Ben Finney on
TP <Tribulations(a)Paralleles.invalid> writes:

> Peter Pearson wrote:
>
> > When you tell python "print '\033[30;44m foo \033[0m'", python
> > interprets the "\033" as a single character.
>
> So, the python print command *can* interpret these 4-character as a
> single character.

Not "interpret", no.

It's more accurate to say that the Python *compiler* will translate
"\033" within a string literal into a single character in the compiled
executable byte code.

That is, the input to the Python interpreter will not have "\033" in
the string literal at all, but instead a single character produced by
the Python compiler at that point in the byte code.

> It would be odd if there were no possibility to do the same thing
> when the characters are (i) stored in a python variable, or (ii)
> come from the environment variables.

Since those are not the input to the Python compiler, they can't be
translated this way.

--
\ “You know I could rent you out as a decoy for duck hunters?” |
`\ —Groucho Marx |
_o__) |
Ben Finney