我正在尝试从我的项目中创建一个 .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
我不想将测试包、doc 和 data 文件夹包含在我的 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 不应该避免将任何内容复制到站点包中吗?