在Python

时间:2015-08-15 12:07:47

标签: python pyqt setuptools pyinstaller cpython

我有下一个案例:

  1. 使用Python + PySide的桌面应用程序
  2. 想在我的应用程序中使用PYD文件(mycore.pyd)
  3. mycore.pyx文件中有一个依赖于Padding模块
    • 此Padding模块已安装到系统
  4. 我构建了Setup.py并将PYX文件转换为PYD文件,我在应用程序中使用
  5. 我得到了什么:

    • 在PyCharm =>下运行我的应用程序后一切都很好
    • 当我使用PyInstaller方法构建应用程序并从cmd =>运行应用程序时我收到错误“没有命名模块填充(请求等)”

    setup.py文件示例:

    from distutils.core import setup
    from Cython.Build import cythonize
    
    
    extensions = ["mycore.pyx"]
    
    setup(
        name='mycore',
        version='1.0',
        ext_modules=cythonize(extensions),
        #packages=['Padding'], - once tried => "error: package directory 'Padding' does not exist"
    )
    

    任何想法或建议都会很棒!

    更新

    还尝试使用setup_tools变体,也没有成功:

    from Cython.Build import cythonize
    from setuptools import setup, find_packages, Extension, Command
    
    
    setup(name='mycore',
          packages = find_packages(),
          version=1.0,
          include_package_data=True,
          platforms=['all'],
          ext_modules=[Extension("mycore", ['mycore.c'])],
          #extra_require = {"Padding"} - also nothing
          )
    

3 个答案:

答案 0 :(得分:3)

要求 PyInstaller 在构建过程中包含所需的模块。似乎最简单的方法是使用--hidden-import参数:

  

--hidden-import=modulename
  命名导入的 Python 模块,该模块在代码中不可见。该模块将被包含,就像它在import语句中命名一样。此选项可以多次出现。

因此,请在构建应用程序时添加以下参数:

--hidden-import=Padding

修改

尝试在单独的*.py文件中导入所有必需的模块(触发错误),而不是导入*.pyx \ *.pyd文件。这是一个丑陋的解决方法,但可能会解决这个问题。

考虑在此方案中使用__init__.py文件。

答案 1 :(得分:1)

这是我最近创建的setup.py(https://github.com/robintiwari/django-me/blob/master/setup.py)文件,它有效并且有类似的问题,我同意@Sanju使用setuptools.find_packages()。它为我解决了这个问题。

答案 2 :(得分:1)

我猜测问题是PyInstaller没有看到由cython代码导入的软件包,所以它不包含在bundle应用程序中。

必须有办法告诉PyInstaller包含Padding包。

我无法告诉你如何 - 从未使用它,但这就是你用py2exe和py2app处理它的方法。