【问题标题】:Error during building setup script in Python在 Python 中构建设置脚本时出错
【发布时间】:2015-11-08 13:33:53
【问题描述】:

我有下一个案例:

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

我得到了什么:

  • 一旦我在 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
      )

【问题讨论】:

标签: python pyqt setuptools pyinstaller cpython


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我猜问题是 PyInstaller 没有看到由 cython 代码导入的包,因此它没有将它包含在捆绑应用程序中。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      --hidden-import=Padding


      编辑:

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

      考虑在这种情况下使用__init__.py 文件。

      【讨论】:

      • 仍然有同样的问题:Traceback (most recent call last): File "C:\Anaconda\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module exec(bytecode, module.__dict__) File "./build/win64\app\out00-PYZ.pyz\src.config", line 7, in <module> File "C:\Anaconda\Lib\site-packages\PyInstaller\loader\pyi_importers.py", line 409, in load_module module = imp.load_module(fullname, fp, filename, self._c_ext_tuple) File "ovocore.pyx", line 4, in init src.ovocore (ovocore.c:11304) ImportError: No module named Padding
      • 这是在构建过程中还是在执行程序时发生的?
      • 执行后编译就OK了
      • 你能加入我的this chat room吗?
      • 不需要使用--hidden-import=Padding,只需要移动__init__.py中的py文件(例如)。非常感谢!!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2014-05-27
      • 2017-07-24
      相关资源
      最近更新 更多