Opened 8 years ago

Closed 8 years ago

#972 closed defect (nonchimerax)

open() opens text as ascii rather than unicode when Mac build is run from the GUI

Reported by: Tristan Croll Owned by: Tom Goddard
Priority: major Milestone:
Component: Core Version:
Keywords: Cc:
Blocked By: Blocking:
Notify when closed: Platform: all
Project: ChimeraX

Description

With a fresh installation of today's ChimeraX 0.5 on the Mac:

If I run ChimeraX by double-clicking on the icon in Finder, install ISOLDE via the ToolShed then run ISOLDE, I get the traceback copied below. The offending lines are:

        infile = open(file_prefix+'.data', 'r')
        lines = [line.rstrip('\n ').split(' ') for line in infile]

where infile contains a number of unicode characters (Greek letters, degree symbol). If I instead run ChimeraX from the terminal (/Applications/ChimeraX.app/Contents/bin/ChimeraX) and run ISOLDE, it works without issue. Note that this text file should only ever be read once - I distribute all my data files as plain text for robustness, and pickle the necessary objects on first run using the logic below.

    try:
        infile = open(file_prefix+'.pickle', 'r+b')
        rotamers = pickle.load(infile)
        infile.close()
        infile = None
    except:
        # Load in and process the data from a text file, and pickle the result for fast loading next time

Traceback:

Traceback (most recent call last):
  File "/Users/tic20/Library/Application Support/ChimeraX/0.5/site-packages/chimerax/isolde/rotamers.py", line 77, in load_rotamers
    rotamers = pickle.load(infile)
ModuleNotFoundError: No module named 'src'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Applications/ChimeraX.app/Contents/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/chimerax/core/toolshed/info.py", line 481, in start_tool
    ti = api._api_caller.start_tool(api, session, self, tool_info)
  File "/Applications/ChimeraX.app/Contents/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/chimerax/core/toolshed/__init__.py", line 953, in start_tool
    return cls._get_func(api, "start_tool")(session, ti.name)
  File "/Users/tic20/Library/Application Support/ChimeraX/0.5/site-packages/chimerax/isolde/__init__.py", line 29, in start_tool
    return tools.get_singleton(session, ISOLDE_ToolUI, 'ISOLDE', create=True)
  File "/Applications/ChimeraX.app/Contents/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/chimerax/core/tools.py", line 214, in get_singleton
    tinst = tool_class(session, tool_name, **kw)
  File "/Users/tic20/Library/Application Support/ChimeraX/0.5/site-packages/chimerax/isolde/tool.py", line 167, in __init__
    from . import isolde
  File "/Users/tic20/Library/Application Support/ChimeraX/0.5/site-packages/chimerax/isolde/isolde.py", line 45, in <module>
    from . import rotamers, dihedrals
  File "/Users/tic20/Library/Application Support/ChimeraX/0.5/site-packages/chimerax/isolde/rotamers.py", line 630, in <module>
    _rotamer_info = load_rotamers(_rot_file_prefix)
  File "/Users/tic20/Library/Application Support/ChimeraX/0.5/site-packages/chimerax/isolde/rotamers.py", line 84, in load_rotamers
    lines = [line.rstrip('\n ').split(' ') for line in infile]
  File "/Users/tic20/Library/Application Support/ChimeraX/0.5/site-packages/chimerax/isolde/rotamers.py", line 84, in <listcomp>
    lines = [line.rstrip('\n ').split(' ') for line in infile]
  File "/Applications/ChimeraX.app/Contents/MacOS/../Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 30: ordinal not in range(128)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Applications/ChimeraX.app/Contents/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/chimerax/core/ui/gui.py", line 781, in <lambda>
    run(ses, "toolshed show %s" % quote_if_necessary(tool_name)))
  File "/Applications/ChimeraX.app/Contents/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/chimerax/core/commands/run.py", line 31, in run
    results = command.run(text, log=log)
  File "/Applications/ChimeraX.app/Contents/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/chimerax/core/commands/cli.py", line 2569, in run
    result = ci.function(session, **kw_args)
  File "/Applications/ChimeraX.app/Contents/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/chimerax/core/commands/toolshed.py", line 334, in toolshed_show
    bi.start_tool(session, tool_name)
  File "/Applications/ChimeraX.app/Contents/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/chimerax/core/toolshed/info.py", line 487, in start_tool
    "start_tool() failed for tool %s in bundle %s:\n%s" % (tool_name, self.name, str(e)))
chimerax.core.toolshed.ToolshedError: start_tool() failed for tool ISOLDE in bundle ChimeraX-ISOLDE:
'ascii' codec can't decode byte 0xcf in position 30: ordinal not in range(128)

Change History (1)

comment:1 by Tom Goddard, 8 years ago

Resolution: nonchimerax
Status: assignedclosed

Take a look at the Python 3 open() documentation.

https://docs.python.org/3/library/functions.html#open

It says that the encoding for a file open in "r" mode is platform dependent, obtained by

locale.getpreferredencoding(False)

A user can change this by setting their locale. So your code cannot assume a certain text encoding used by open() and has to specify the open() encoding option if you want it to work reliably.

Note: See TracTickets for help on using tickets.