在 Python 中构建设置脚本时出错
Error during building setup script in Python
我有下一个案例:
- 带有 Python + PySide 的桌面应用程序
- 想在我的应用程序中使用 PYD 文件 (mycore.pyd)
- mycore.pyx 文件中有一个依赖于 Padding 模块
- 这个Padding模块已经安装到系统中
- 我构建 Setup.py 并将 PYX 文件转换为我在应用程序中使用的 PYD 文件
我得到的:
- 一旦我 运行 我的应用程序在 PyCharm 下 => 一切正常
- 当我使用 PyInstaller 方法构建应用程序并且 运行 来自 cmd 的应用程序时 => 我发现错误 "No named module Padding (requests etc)"
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
)
这是我最近创建的一个 setup.py (https://github.com/robintiwari/django-me/blob/master/setup.py) 文件,它可以工作并且有类似的问题,我同意@Sanju 使用 setuptools.find_packages()。它为我解决了这个问题。
我猜问题是 PyInstaller 看不到 cython 代码导入的包,因此它没有将其包含在捆绑应用程序中。
一定有办法告诉 PyInstaller 包含 Padding 包。
我无法告诉您如何操作 -- 从未使用过它,但这就是您使用 py2exe 和 py2app 处理它的方式。
请求 PyInstaller 在构建过程中包含所需的模块。似乎最简单的方法是使用 --hidden-import
参数:
--hidden-import=modulename
Name an imported Python module that is not visible in your code. The module will be included as if it was named in an import
statement. This option can be given more than once.
因此,请在构建应用程序时添加以下参数:
--hidden-import=Padding
编辑:
尝试在单独的 *.py
文件中导入所有必需的模块(会触发错误),而不是在 *.pyx
\ *.pyd
文件中。这是一个丑陋的解决方法,但仍然可以解决问题。
考虑在这种情况下使用 __init__.py
文件。
我有下一个案例:
- 带有 Python + PySide 的桌面应用程序
- 想在我的应用程序中使用 PYD 文件 (mycore.pyd)
- mycore.pyx 文件中有一个依赖于 Padding 模块
- 这个Padding模块已经安装到系统中
- 我构建 Setup.py 并将 PYX 文件转换为我在应用程序中使用的 PYD 文件
我得到的:
- 一旦我 运行 我的应用程序在 PyCharm 下 => 一切正常
- 当我使用 PyInstaller 方法构建应用程序并且 运行 来自 cmd 的应用程序时 => 我发现错误 "No named module Padding (requests etc)"
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
)
这是我最近创建的一个 setup.py (https://github.com/robintiwari/django-me/blob/master/setup.py) 文件,它可以工作并且有类似的问题,我同意@Sanju 使用 setuptools.find_packages()。它为我解决了这个问题。
我猜问题是 PyInstaller 看不到 cython 代码导入的包,因此它没有将其包含在捆绑应用程序中。
一定有办法告诉 PyInstaller 包含 Padding 包。
我无法告诉您如何操作 -- 从未使用过它,但这就是您使用 py2exe 和 py2app 处理它的方式。
请求 PyInstaller 在构建过程中包含所需的模块。似乎最简单的方法是使用 --hidden-import
参数:
--hidden-import=modulename
Name an imported Python module that is not visible in your code. The module will be included as if it was named in animport
statement. This option can be given more than once.
因此,请在构建应用程序时添加以下参数:
--hidden-import=Padding
编辑:
尝试在单独的 *.py
文件中导入所有必需的模块(会触发错误),而不是在 *.pyx
\ *.pyd
文件中。这是一个丑陋的解决方法,但仍然可以解决问题。
考虑在这种情况下使用 __init__.py
文件。