cx_freeze - 包括我自己的模块?

dan*_*n_g 6 python py2exe importerror cx-freeze

我有一个用PyQt4构建的小应用程序,我试图用cx_freeze冻结,但是我遇到了cx_freeze的问题,包括我自己的应用程序工作所需的模块.

我有两个在我的应用程序中导入的模块,这些模块位于应用程序所在的文件夹上方.即:

申请路径:

Python的\ DataViewer的-PyQt4的\ DataViewer.py

其他模块:

Python\My Analysis Packages\Ephystools

Python\My Analysis Packages\PrairieAnalysis

在我的应用程序中,我使用(如果它们不在我的python路径中)导入这些

sys.path.append(os.path.abspath('../My Analysis Packages'))
Run Code Online (Sandbox Code Playgroud)

我尝试在setup.py文件中的'includes'和'packages'中包含PrairieAnalysis和EphysTools.我也试过包括"我的分析包".我也试过提供这些路径.

它们都包含init .py文件,因为实际的应用程序能够很好地导入它们.

如果我将PrairieAnalysis和/或EphysTools放在'includes'列表中,那么setup.py build会返回一个ImportError:

 File "C:\Anaconda3\lib\site-packages\cx_Freeze\finder.py", line 386, in _ImportModule
    raise ImportError("No module named %r" % name)
ImportError: No module named 'PrairieAnalysis'
Run Code Online (Sandbox Code Playgroud)

如果我将它们从'includes'中取出,则setup.py构建完成,但是当我打开应用程序时,我得到同样的错误.

我查看了各种cx_freeze模块导入问题,但似乎没有人处理过这个特定的场景.

我的实际setup.py:

# -*- coding: utf-8 -*-

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

options = {
    'build_exe': {
        'includes': ['atexit', 'PrairieAnalysis', 'EphysTools'],
    }
}

executables = [
    Executable('DataViewer.py', base=base)
]

setup(name='DataViewer',
      version='0.1',
      description='Application for viewing Prairie-generated csv data files',
      options=options,
      executables=executables
      )
Run Code Online (Sandbox Code Playgroud)

编辑1:从setup.py文件中的os.getcwd()输出:

D:\OneDrive\Documents\Python\DataViewer-PyQt4
Run Code Online (Sandbox Code Playgroud)

setup.py文件中sys.path的输出:

    ['D:\\OneDrive\\Documents\\Python\\DataViewer-PyQt4', 'D:\\OneDrive\\Documents\\Python\\My Analysis Packages', 'C:\\Anac
    onda3\\python34.zip', 'C:\\Anaconda3\\DLLs', 'C:\\Anaconda3\\lib', 'C:\\Anaconda3', 'C:\\Anaconda3\\lib\\site-packages',
     'C:\\Anaconda3\\lib\\site-packages\\Sphinx-1.2.3-py3.4.egg', 'C:\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Anaconda3
    \\lib\\site-packages\\win32\\lib', 'C:\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Anaconda3\\lib\\site-packages\\r
    unipy-0.1.1-py3.4.egg', 'C:\\Anaconda3\\lib\\site-packages\\setuptools-7.0-py3.4.egg']
Run Code Online (Sandbox Code Playgroud)

编辑2:

所以我也试过使用py2exe,我遇到了同样的问题.如果我在"包含"中包含包,我会得到以下回溯:

Traceback (most recent call last):
  File "setup.py", line 7, in <module>
    setup(windows=['DataViewer.py'], options={"py2exe": {"includes" :["sip", "PyQt4.QtCore", "PyQt4.QtGui", "PrairieAnal
ysis", "EphysTools"]}})
  File "C:\Anaconda3\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
  File "C:\Anaconda3\lib\distutils\dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "C:\Anaconda3\lib\distutils\dist.py", line 974, in run_command
    cmd_obj.run()
  File "C:\Anaconda3\lib\site-packages\py2exe\distutils_buildexe.py", line 188, in run
    self._run()
  File "C:\Anaconda3\lib\site-packages\py2exe\distutils_buildexe.py", line 267, in _run
    builder.analyze()
  File "C:\Anaconda3\lib\site-packages\py2exe\runtime.py", line 164, in analyze
    mf.import_hook(modname)
  File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 120, in import_hook
    module = self._gcd_import(name)
  File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 274, in _gcd_import
    return self._find_and_load(name)
  File "C:\Anaconda3\lib\site-packages\py2exe\mf3.py", line 318, in _find_and_load
    loader = importlib.find_loader(name, path)
  File "C:\Anaconda3\lib\importlib\__init__.py", line 87, in find_loader
    name=name)
ImportError: namespace packages do not have loaders
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我把我的两个包(PrairieAnalysis和EphysTools)放到我的site-packages文件夹中.为什么我的包装与其他包装的处理方式不同?

编辑3:所以我使用以下安装脚本让py2exe工作:

from distutils.core import setup
import py2exe
import PrairieAnalysis.pv_import
import EphysTools.utilities

includes = ["sip", "PyQt4.QtCore", "PyQt4.QtGui", "PrairieAnalysis", "EphysTools", "lxml._elementpath"]
packages = ["PrairieAnalysis", "EphysTools"]

setup(windows=['DataViewer.py'], options={"py2exe": {"includes" : includes,
                                                     "packages": packages}})
Run Code Online (Sandbox Code Playgroud)

仅仅导入PrairieAnalysis和EphysTools并没有起作用,也没有做到

from PrairieAnalysis import *
from EphysTools import *
Run Code Online (Sandbox Code Playgroud)

但是,将这些import语句添加到我的cx_freeze setup.py脚本中并不能解决问题.

编辑4:

>>> import PrairieAnalysis
>>> print(PrairieAnalysis.__file__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'
>>> print(PrairieAnalysis.__init__)
<method-wrapper '__init__' of module object at 0x0000000002B9C9F8>
Run Code Online (Sandbox Code Playgroud)

编辑5:

>>> os.listdir('D:\\OneDrive\\Documents\\Python\\My Analysis Packages')
['.idea', 'EphysTools', 'PrairieAnalysis', '__init___.py']
>>> os.listdir('D:\\OneDrive\\Documents\\Python\\My Analysis Packages\\PrairieAnalysis')
['misc_code.py', 'pv_import.py', 'pxml_parse.py', '__init___.py', '__pycache__']
>>> os.listdir('D:\\OneDrive\\Documents\\Python\\My Analysis Packages\\EphysTools')
['synaptics.py', 'utilities.py', '__init___.py', '__pycache__']
Run Code Online (Sandbox Code Playgroud)

Tho*_*s K 5

您需要以sys.path与应用程序中相同的方式修改 setup.py 脚本。cx_Freeze 查看 sys.path 以查找要包含在构建中的模块和包,因此如果包含这些包的目录不在 sys.path 上,则它无法找到它们。

编辑:事实证明问题是一个错误命名的__init__.py文件。该包仍然可以作为PEP 420命名空间包导入,但 cx_Freeze 尚不能处理这些。