|
From: TP on 6 Jul 2008 17:42 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 7 Jul 2008 00:09 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 7 Jul 2008 01:25 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 7 Jul 2008 01:32 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 7 Jul 2008 03:14
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 |