当 pandas 是导入时,Cx_freeze TypeError 只能连接列表(不是“NoneType”)以使用 numpy 依赖项列出

Posted

技术标签:

【中文标题】当 pandas 是导入时,Cx_freeze TypeError 只能连接列表(不是“NoneType”)以使用 numpy 依赖项列出【英文标题】:Cx_freeze TypeError can only concatenate list (not "NoneType") to list using numpy dependency when pandas is an import 【发布时间】:2016-08-17 22:19:23 【问题描述】:

我正在尝试使用 cxfreeze 将以下脚本转换为可执行文件

import datetime
from calendar import monthrange
from tia.bbg import LocalTerminal as Lt
import pandas as pd
from pypyodbc import connect, DatabaseError

print 'Hello World!'

在命令行中运行以下行时:

cxfreeze test_freeze.py --target-dir test_freeze

我得到以下回溯

Traceback (most recent call last):
    File "C:\Python27\Scripts\cxfreeze", line 5, in <module>
        main()
    File "C:\Python27\lib\site-packages\cx_Freeze\main.py", line 188, in main
        freezer.Freeze()
    File "C:\Python27\lib\site-packages\cx_Freeze\freezer.py", line 621, in Freeze
        self._FreezeExecutable(executable)
    File "C:\Python27\lib\site-packages\cx_Freeze\freezer.py", line 225, in _FreezeExecutable
        exe.copyDependentFiles, scriptModule)
    File "C:\Python27\lib\site-packages\cx_Freeze\freezer.py", line 602, in _WriteModules
        path = os.pathsep.join([origPath] + module.parent.path)
TypeError: can only concatenate list (not "NoneType") to list

令人惊讶的是,文件仍然被创建,但是运行时我得到了这个回溯:

C:\Python27\Scripts\test_freeze>test_freeze.exe
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in <module>
    exec(code, m.__dict__)
  File "test_freeze.py", line 3, in <module>
  File "C:\Python27\lib\site-packages\tia\bbg\__init__.py", line 1, in <module>
    from tia.bbg.v3api import *
  File "C:\Python27\lib\site-packages\tia\bbg\v3api.py", line 5, in <module>
    import pandas as pd
  File "C:\Python27\lib\site-packages\pandas\__init__.py", line 18, in <module>
    raise ImportError("Missing required dependencies 0".format(missing_dependencies))
ImportError: Missing required dependencies ['numpy']

注意事项:

我成功运行了一次(使用真正的非“hello world”代码)并成功编译,我为数据库更改了一个字符串,但出现此错误。

当我注释掉 tia.bbg 导入和 pandas 导入时,错误停止并且程序成功冻结。注释掉 tia 也很重要,因为它是围绕 pandas 构建的包装器,所以这是有道理的。我可以自信地说 tia 不是问题,因为仅将其注释掉会引发相同的 pandas/numpy 相关错误

我正在使用 Windows 10 64 位、Python 2.7.12 64 位 AMD、Pandas 0.18.1 以及其他任何相关的版本也是最新版本,因为我刚刚安装了 Python 和所有模块以避免这个问题。它曾多次在以前的安装中工作,但随后出现相同的错误。

我的问题是如何让这个脚本正确运行,否则,我可以使用哪些模块来实现相同的目标?

【问题讨论】:

【参考方案1】:

我遇到了这个问题。您可以明确排除所有有问题的模块,但通过调试我想我找到了负责的代码和一个小错误修复:)。以下内容应该可以帮助您克服这个问题(并且可能会引导您找到下一个缺少的依赖项;))

检查freeze.py的代码,有一种情况没有检查,所以我对freezer.py做了如下修改:

第 600 行,来自

    try:
        if module.parent is not None:
            path = os.pathsep.join([origPath] + module.parent.path)
            os.environ["PATH"] = path
        self._CopyFile(module.file, target, copyDependentFiles)
    finally:
        os.environ["PATH"] = origPath

到:

    try:
        if module.parent is not None:
            if module.parent.path is not None:
                path = os.pathsep.join([origPath] + module.parent.path)
                os.environ["PATH"] = path
                self._CopyFile(module.file, target, copyDependentFiles)
            else:
                path = os.pathsep.join([origPath, os.path.dirname(module.parent.file)])
                os.environ["PATH"] = path
                print '========================================================'
    finally:
        os.environ["PATH"] = origPath

【讨论】:

此修复存在问题:不再复制具有“父级为无”的模块。您应该为此添加一个“else”分支。 我认为这段代码是在说“找到父级并复制父级”(注意查找和添加父级,而不是模块)如果父级为无,那么将没有父级添加(或者会有,但我不知道足够深的代码来解决这个问题......)......但是已经 2 年了,我可能不记得什么......

以上是关于当 pandas 是导入时,Cx_freeze TypeError 只能连接列表(不是“NoneType”)以使用 numpy 依赖项列出的主要内容,如果未能解决你的问题,请参考以下文章

cx_Freeze ImportError:无法导入名称

cx_Freeze 无法使用 pandas 构建 msi

cx_Freeze 的熊猫分析问题

使用 win32wnet 导入时使用 cx_freeze 编译后的 DLL 问题

cx_Freeze 没有名为“Tkinter”的模块

cx_freeze 无法捆绑 django.utils.six.moves