[PySide] cxfreeze and PySide 1.2.0

Roman Lacko backup.rlacko at gmail.com
Wed Jul 10 20:31:54 CEST 2013


2013/7/10 Joel B. Mohler <jmohler at gamry.com>

> On 7/9/2013 11:20 AM, John Ehresman wrote:
> > On 7/9/13 11:06 AM, Joel B. Mohler wrote:
> >> I have tried commenting out the _setupQtDirectories in __init__.py. It
> >> then crashes (ala segfault) on the import of QtCore.  I can't think of
> >> anything that makes sense explaining that crash since it works fine
> >> unfrozen and the normal cxfreeze failure mode is to have some missing
> >> dll or module ... not crashes.
> >
> > It would be nice for someone to try this in a debug build and hopefull
> > identify where it's segfaulting.  Even if it won't work without a
> > qt.conf, it shouldn't segfault.
>
> Aha, this has been an interesting journey to get this all compiled in
> debug.  I have found the problem.
>
>          Shiboken::AutoDecRef atexit(Shiboken::Module::import("atexit"));
>          Shiboken::AutoDecRef regFunc(PyObject_GetAttrString(atexit,
> "register"));
>
> This C-level module import in qtcore_module_wrapper.cpp imports python
> module atexit, but it fails and so the second line crashes because
> atexit is null.  So, easy fix is to include "--include-modules=atexit"
> in the cxfreeze command line.
>
> So, what is the correct fix?  I think that import in sbkmodule.cpp does
> right to set the PyErr, but the calling code copied above originating
> from typesystem_core_common.xml (I think?) doesn't check PyErr_Occurred
> and I don't know how the error should propagate in the abstract
> conditions of typesystem_core_common.xml.
>
> With that knowledge, then I suggest the following is a cxfreeze friendly
> implementation of __file__ access appropriate in this context:
>
> diff --git a/PySide/_utils.py.in b/PySide/_utils.py.in
> index fb2d25e..f82ce65 100644
> --- a/PySide/_utils.py.in
> +++ b/PySide/_utils.py.in
> @@ -84,8 +84,10 @@ if sys.platform == 'win32':
>           return path
>
>       def get_pyside_dir():
> -        return
> _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(__file__)))
> +        from . import QtCore
> +        return
>
> _get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(QtCore.__file__)))
>
>   else:
>       def get_pyside_dir():
> -        return os.path.abspath(os.path.dirname(__file__))
> +        from . import QtCore
> +        return os.path.abspath(os.path.dirname(QtCore.__file__))
>

Just small correction - on linux the "import . from QtCore" fails when
running post install script first time, so it should be:

....
    def get_pyside_dir():
        from . import QtCore
        return
_get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(QtCore.__file__)))
else:
    def get_pyside_dir():
        try:
            from . import QtCore
        except ImportError:
            return os.path.abspath(os.path.dirname(__file__))
        else:
            return os.path.abspath(os.path.dirname(QtCore.__file__))
....

-Roman


> I would be happy to hear opinions on these topics.
>
> Joel
>
> _______________________________________________
> PySide mailing list
> PySide at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/pyside
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20130710/7e90daf6/attachment.html>


More information about the PySide mailing list