python - 不考虑子包中的文件

标签 python py2exe distutils setup.py

我正在尝试从我的项目中创建一个 .exe,但 py2exe 似乎失败了,因为我添加了一个包含外部库的 lib 子包。

这是我的项目的设置方式:

C:.
¦   LICENSE
¦   README.markdown
¦   requirements.txt
¦   run.sh
¦   setup.py
¦   TODO
¦
+---data
¦   +---input
¦   +---output
+---doc
¦
+---facemovie
¦   ¦   Eye.py
¦   ¦   Face.py
¦   ¦   Facemovie.py
¦   ¦   Facemoviefier.py
¦   ¦   FaceParams.py
¦   ¦   Guy.py
¦   ¦   training_types.py
¦   ¦   __init__.py
¦   ¦
¦   +---lib
¦           exif.py
¦           __init__.py
¦
+---test
        context.py
        exif_test.py
        face_script.py
        test_script.py
        __init__.py

我不想将测试包、文档和数据文件夹包含到我的 exe 中。我的可执行文件的根目录应该是facemovie 包。

我正在尝试通过我的 setup.py 文件创建可执行文件,如下所示:

from distutils.core import setup
import py2exe, sys, os
import facemovie

sys.argv.append('py2exe')


setup(
    name = "Facemovie",
    url = "https://github.com/jlengrand/FaceMovie",
    packages=['facemovie', 'facemovie.lib'],
    options = {'py2exe': {'bundle_files': 1, 'includes': ['numpy', 'facemovie.lib.exif'] } },
    console=['facemovie/Facemoviefier.py'],
    zipfile = None,
)

如您所见,我的应用程序的主入口文件是 Facemovifier.py。 一切都运行良好,直到我添加 lib 子包。

当我运行 py2exe 命令时,这是输出的一部分:

running install
running build
running build_py
copying facemovie\Eye.py -> build\lib\facemovie
copying facemovie\Face.py -> build\lib\facemovie
copying facemovie\Facemovie.py -> build\lib\facemovie
copying facemovie\Facemoviefier.py -> build\lib\facemovie
copying facemovie\FaceParams.py -> build\lib\facemovie
copying facemovie\Guy.py -> build\lib\facemovie
copying facemovie\training_types.py -> build\lib\facemovie
copying facemovie\__init__.py -> build\lib\facemovie
copying facemovie\lib\exif.py -> build\lib\facemovie\lib
copying facemovie\lib\__init__.py -> build\lib\facemovie\lib
running install_lib
running install_egg_info
Removing C:\Python27\Lib\site-packages\Facemovie-0.4-py2.7.egg-info
Writing C:\Python27\Lib\site-packages\Facemovie-0.4-py2.7.egg-info
running py2exe
.......
Adding python27.dll as resource to C:\Users\jll\perso\workspace\FaceMovie\dist\Facemoviefier.exe
The following modules appear to be missing
['Carbon', 'Carbon.Files', 'Numeric', 'Pyrex.Compiler.Main', '__svn_version__', '_curses', '_scproxy', 'configparser', ...,  'lib.exif']

正如你所看到的,lib/exif文件实际上被复制了,但后来找不到了。

当我尝试运行可执行文件时,输出如下:

C:\Users\jll\perso\workspace\FaceMovie\dist>Facemoviefier.
Traceback (most recent call last):
  File "Facemoviefier.py", line 12, in <module>
  File "zipextimporter.pyc", line 82, in load_module
  File "Facemovie.pyc", line 10, in <module>
ImportError: No module named lib.exif

这是 Facemovie.py 中导致错误的行:

import lib.exif as exif

过去几天我尝试了各种方法并阅读了很多文档,但始终无法理解问题出在哪里。我有所需的 init.py 文件,并且我的 Python 代码运行没有任何问题。

我真的很感激任何提示。

谢谢!

编辑:

问题终于解决了。 @mata 拥有正确的解决方案(尽管我在此处发布之前已经尝试过这些行)。

实际的问题来自于 py2exe 通过复制我的 py 文件来启动

C:\Python27\Lib\site-packages

并且显然使用它们来创建exe。 在创建过程中,它们被编译为 .pyc。

进一步创建可执行文件会跳过编译,因为 site-packages 文件夹已包含 .pyc 文件

我找到了一个临时解决方案,可以在构建之前使用 ant 目标删除这些文件,但我想知道这是否是一个好的做法。

在我达到稳定状态之前,py2exe 是否应该避免将任何内容复制到站点包中?

最佳答案

而不是:

import lib.exif as exif

尝试:

import facemovie.lib.exif as exif
# or
from facemovie.lib import exif

关于python - 不考虑子包中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691268/

相关文章:

python - 基于列表/字典动态更改 networkx 中箭头的大小

python - 为 Tk().iconbitmap() 使用类似对象的文件

python - 将使用pygame的python程序编译成可执行文件

python - Solaris python setuptools 安装

python - GAE 给我发电子邮件错误

python - 如何选择在 Pandas 数据框中持续存在的数据

python - Python 的图标覆盖问题

python - 不满足依赖项时安装 Setuptools setup.py

python - 导入 Cython 模块时出现 undefined symbol 错误

python - 由于输入输出错误无法安装anaconda3