Skip to content

gpython: Run code in carefully prepared __main__ module

Kirill Smelkov requested to merge kirr/pygolang:y/gpython-__main__ into master

Because else sys.modules['__main__'] points to the module of gpython itself, not user program. This difference can be important when e.g. user defines classes in main module and tries to pickle them. Such pickling will fail if gpython is not careful to run user's code in its own main.

The problem was discovered while trying to run test program from https://github.com/zopefoundation/ZEO/issues/166:

$ gpython zopenrace-zeo.py
Traceback (most recent call last):
  File "/home/kirr/tmp/trashme/Z/py2.venv/bin/gpython", line 8, in <module>
    sys.exit(main())
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/gpython/__init__.py", line 395, in main
    pymain(argv, init)
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/gpython/__init__.py", line 266, in pymain
    run()
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/gpython/__init__.py", line 172, in run 
    _execfile(filepath, g)
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/gpython/__init__.py", line 275, in _execfile
    six.exec_(code, globals, locals)
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/six.py", line 719, in exec_
    exec("""exec _code_ in _globs_, _locs_""")
  File "<string>", line 1, in <module>
  File "zopenrace-zeo.py", line 205, in <module>
    main()
  File "zopenrace-zeo.py", line 190, in main
    init()
  File "zopenrace-zeo.py", line 126, in init
    transaction.commit()
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/transaction/_manager.py", line 257, in commit
    return self.manager.commit()
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/transaction/_manager.py", line 134, in commit
    return self.get().commit()
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/transaction/_transaction.py", line 282, in commit
    reraise(t, v, tb) 
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/transaction/_transaction.py", line 273, in commit
    self._commitResources()
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/transaction/_transaction.py", line 456, in _commitResources
    reraise(t, v, tb) 
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/transaction/_transaction.py", line 430, in _commitResources
    rm.commit(self)
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/ZODB/Connection.py", line 497, in commit
    self._commit(transaction)
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/ZODB/Connection.py", line 546, in _commit
    self._store_objects(ObjectWriter(obj), transaction)
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/ZODB/Connection.py", line 578, in _store_objects
    p = writer.serialize(obj)  # This calls __getstate__ of obj 
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/ZODB/serialize.py", line 430, in serialize
    return self._dump(meta, obj.__getstate__())
  File "/home/kirr/tmp/trashme/Z/py2.venv/lib/python2.7/site-packages/ZODB/serialize.py", line 439, in _dump
    self._p.dump(state)
PicklingError: Can't pickle <class '__main__.PInt'>: attribute lookup __main__.PInt failed

/cc @jerome

Merge request reports