Skip to main content

Hi !

 

 

Something seems very odd to me using python from inside fme...

Note I'm french, so I handle data with a lot off accented characters. Using FME 2016 on windows server, with Python 2.7, I faced a LOT of characters encoding issues, and am still facing some puzzling situations.

 

 

for what I understood :

 

1) The usual mentions # -*- coding : utf8 -*- or likes, (that every text editor would use to encode the script as utf8) are ignored by FME's Python Callers' text editor, I finally figured out that the code itself is encoded by fme using windows encoding (windows-1252) in my case.

That alone could be source of errors, if the python interpreter reads 

# -*- coding : utf8 -*- 
someVariable = u'Projet Terminé'

While the code is encoded as windows-1252 the interpreter will try to use an utf8 codex to decode it and get the unicode value for its variable, resulting in an error.

This has a sample solution, use # -*- coding : windows-1252 -*- at the start of each script, to be sure that the interpreter and FME are on the same page... But here is the trick :

2) feature.getAttribute() fails to use the correct decoding and produces something like u'Projet Termin\xe9' so I guess he thought it was utf8, but why would he use a utf8 decoder for feature.getAttribute and cp-1252/Latin-1 for everything else ? This is still quite blurry for me.

 

 

3) When printing to FME Console, every string must be utf-8 encoded.

This is mildly infuriating...

 

I can't find anywhere if there are parameters to change the default encodings of FME. 

Can you switch to Python 3.x in FME? That would probably save you a lot of headaches.

Although I'm curious to hear if it helps for this particular problem. Could well be a bug or some use-case that hasn't been anticipated by the mostly anglophile developers at Safe.


Can you switch to Python 3.x in FME? That would probably save you a lot of headaches.

Although I'm curious to hear if it helps for this particular problem. Could well be a bug or some use-case that hasn't been anticipated by the mostly anglophile developers at Safe.

Ah, I wish ^^ unfortunately Python 3.x can't work with FME 2016

 

c.f. This question

Hi @vchalmel

Thanks for reporting your encoding issue with Python.  The first thing I wanted to do is reproduce your problem.

So, with the following:
  • FME 2016.1 build 16717 64-bit on Windows 10
  • Python 2.7

I tried the following script in the PythonCaller:

import fme
import fmeobjects

class FeatureProcessor(object):
    def __init__(self):
        self._log = fmeobjects.FMELogFile()
        pass
    def input(self,feature):
        e = u'é'
        self._log.logMessageString('e type: ' + str(type(e)))
        self._log.logMessageString('e: ' + e);
        print(e.encode('utf-8'))
        
        feature.setAttribute('e', e)
        
        feat_e = feature.getAttribute('e')
        self._log.logMessageString('feat_e type: ' + str(type(feat_e)))
        self._log.logMessageString('feat_e: ' + feat_e)
        
        self.pyoutput(feature)
    def close(self):
        pass

Here is what I get as a result in the Translation Log:

0684Q00000ArLEEQA3.png

0684Q00000ArLJTQA3.png

Notice the following:
1) I did not add a `# -*- coding : windows-1252 -*-` or similar line to the top of the script.  Through some experimentation, it appears those lines have no affect on Windows when we pass the script to the Python interpreter for running.  On Mac, it appears the encoding line does do something and in those cases we always recommend passing `utf-8` as the encoding because that is the 'system' encoding for Mac.
In general, I don't believe you need to worry about the encoding of the script you are writing.  FME will store it as a unicode type and will pass it into the interpreter with the appropriate encoding ('system' encoding for Python 2.7 and utf-8 encoding for Python 3.x).
2) The result from `feat_e = feature.getAttribute('e')` is a `unicode` type object that has a value of é.  Since it's a unicode object, there isn't an encoding associated with it.  A byte-string of any appropriately desired encoding can be retrieved through the unicode.encode(<encoding name>) method.
3) True, when `print()` is called for output to the Translation Log, unicode strings need a bit of help and need to be encoded to a utf-8 byte-string.
There is still some confusion on what problems you are experiencing.  Can you provide a sample PythonCaller script showing the issue, so we can try it on our end?  Thanks.


Reply