Program works great, except under less, cron or execl (Unicode?)

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Sam

    Program works great, except under less, cron or execl (Unicode?)

    I have a program which works great when run from the command line.

    But when I run it combined with something else such as:
    - piping it through less
    - cron
    - execl (i.e. calling it from another python program)

    it gives me a unicode error

    File "../myparser.py", line 261, in set_attributes
    print "self.atd['Name'] is: ", self.atd['Name']
    UnicodeEncodeEr ror: 'ascii' codec can't encode character u'\xeb' in
    position 7: ordinal not in range(128)

    I'd post the whole program here, except it involves weird Unicode
    strings.

    I could probably change the program to get it working under less/cron/
    etc.

    But I'd rather understand exactly what the issue is. Why does it work
    fine when run directly from the command line, but not otherwise?
  • Diez B. Roggisch

    #2
    Re: Program works great, except under less, cron or execl (Unicode?)

    Sam wrote:
    I have a program which works great when run from the command line.
    >
    But when I run it combined with something else such as:
    - piping it through less
    - cron
    - execl (i.e. calling it from another python program)
    >
    it gives me a unicode error
    >
    File "../myparser.py", line 261, in set_attributes
    print "self.atd['Name'] is: ", self.atd['Name']
    UnicodeEncodeEr ror: 'ascii' codec can't encode character u'\xeb' in
    position 7: ordinal not in range(128)
    >
    I'd post the whole program here, except it involves weird Unicode
    strings.
    >
    I could probably change the program to get it working under less/cron/
    etc.
    >
    But I'd rather understand exactly what the issue is. Why does it work
    fine when run directly from the command line, but not otherwise?
    Most probably because when to running directly inside a terminal, it gets
    it's stdin/stdout as pipes - and python can't attempt to guess the proper
    encoding on that, as it does on a terminal.

    And thus, when you print unicode to the pipe, it can't decide which encoding
    to use.

    To circumvene this, try & wrap stdout into a codecs-module wrapper with a
    proper encoding applied (e.g. utf-8).

    You might make that conditionally based on the sys.stdout.enco ding-variable
    being set or not, albeit I'm not 100% sure to what it actually gets set
    when used in a subprocess. But this should give you the idea where to look.



    Diez

    Comment

    • Diez B. Roggisch

      #3
      Re: Program works great, except under less, cron or execl (Unicode?)

      Most probably because when to running directly inside a terminal, it gets

      That was of course meant to be "not running directly inside a terminal".
      it's stdin/stdout as pipes - and python can't attempt to guess the proper
      encoding on that, as it does on a terminal.
      Diez

      Comment

      • Sam

        #4
        Re: Program works great, except under less, cron or execl (Unicode?)

        Diez for the win... :)

        sys.stdout.enco ding does indeed have the proper value when called from
        the command line of UTF-8.

        But when piped into anything or called from anywhere it's None.

        Just for completeness, here's my test program:
        #!/usr/bin/env python
        import sys
        print sys.stdout.enco ding

        And here are the results:
        $ ./encoding.py
        UTF-8
        $ ./encoding.py | cat
        None

        Really, really annoying!

        So how can I set sys.stdout.enco ding so it's UTF-8 when piped through
        cat (or anything else).

        I tried assigning to it, but no dice.

        On Sep 18, 2:12 am, "Diez B. Roggisch" <de...@nospam.w eb.dewrote:
        Sam wrote:
        I have a program which works great when run from the command line.
        >
        But when I run it combined with something else such as:
        - piping it through less
        - cron
        - execl (i.e. calling it from another python program)
        >
        it gives me a unicode error
        >
         File "../myparser.py", line 261, in set_attributes
            print "self.atd['Name'] is: ", self.atd['Name']
        UnicodeEncodeEr ror: 'ascii' codec can't encode character u'\xeb' in
        position 7: ordinal not in range(128)
        >
        I'd post the whole program here, except it involves weird Unicode
        strings.
        >
        I could probably change the program to get it working under less/cron/
        etc.
        >
        But I'd rather understand exactly what the issue is.  Why does it work
        fine when run directly from the command line, but not otherwise?
        >
        Most probably because when to running directly inside a terminal, it gets
        it's stdin/stdout as pipes - and python can't attempt to guess the proper
        encoding on that, as it does on a terminal.
        >
        And thus, when you print unicode to the pipe, it can't decide which encoding
        to use.
        >
        To circumvene this, try & wrap stdout into a codecs-module wrapper with a
        proper encoding applied (e.g. utf-8).
        >
        You might make that conditionally based on the sys.stdout.enco ding-variable
        being set or not, albeit I'm not 100% sure to what it actually gets set
        when used in a subprocess. But this should give you the idea where to look.
        >
        Diez

        Comment

        • Lawrence D'Oliveiro

          #5
          Re: Program works great, except under less, cron or execl (Unicode?)

          In message
          <c89b7723-50c4-432f-a1e8-7f62f1232ece@v1 6g2000prc.googl egroups.com>, Sam
          wrote:
          So how can I set sys.stdout.enco ding so it's UTF-8 when piped through
          cat (or anything else).
          >
          I tried assigning to it, but no dice.
          You could try wrapping it in a file object that does explicit encoding
          translation, using codecs.EncodedF ile
          <http://docs.python.org/lib/module-codecs.html>.

          Comment

          Working...