子包中的文件未考虑在内

时间:2012-05-21 19:19:37

标签: 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

我不想将测试包,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是否应该避免将任何内容复制到网站包中?

1 个答案:

答案 0 :(得分:1)

而不是:

import lib.exif as exif

尝试:

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