Python 用ruamel.yaml冷冻CX_

Python 用ruamel.yaml冷冻CX_,python,cx-freeze,ruamel.yaml,Python,Cx Freeze,Ruamel.yaml,我无法让CX_Freeze将包ruamel.yaml包含在build_exe中 我还尝试将其添加到“packages”选项中,如 build_exe_options = { ... "packages": [ ... "ruamel.yaml", ... ] ... } cx_Freeze.setup( ... executables=[cx_Freeze.Executable("pyhathipre

我无法让CX_Freeze将包ruamel.yaml包含在build_exe中

我还尝试将其添加到“packages”选项中,如

build_exe_options = {
    ...
    "packages": [
        ...
        "ruamel.yaml",
        ...
    ]
    ...
}
cx_Freeze.setup(
    ...
    executables=[cx_Freeze.Executable("pyhathiprep/__main__.py",
                                  targetName="pyhathiprep.exe", base="Console")],
)
我得到

File "C:\Users\hborcher\PycharmProjects\pyhathiprep\.env\lib\site-packages\cx_Freeze\finder.py", line 350, in _ImportModule
raise ImportError("No module named %r" % name)
ImportError: No module named 'ruamel.yaml'
我尝试过将其添加到“名称空间\u包”中,如

我得到

File "C:\Users\hborcher\PycharmProjects\pyhathiprep\.env\lib\site-packages\cx_Freeze\finder.py", line 221, in _FindModule
return None, module.__path__[0], info
TypeError: '_NamespacePath' object does not support indexing

我做错了什么?

ruamel.yaml
doc
明确指出,您必须使用最新版本的
pip
setuptools
来安装
ruamel.yaml

CX\U Freeze没有调用
pip
,也不支持从(正确预配置的)
.whl
文件进行安装。相反,它似乎以自己的方式调用
setup()

您可以尝试在源目录中创建一个
ruamel
目录,然后在该目录中创建一个空的
\uuuu init\uuuuuuuuupy
文件和
yaml
目录。在该
yaml
目录中,从解包的跳过
setup.py的
.py
文件和所有其他安装文件中复制所有
.py
文件。或者,您也可以从中签出这些文件,但是还有更多不必要的问题需要处理,如果您不按发布标签签出,您可能会有一个未发布的中间版本。
一旦成功,您将在冻结的应用程序中拥有一个“纯”Python版本的
ruamel.yaml


如果您使用的是
yaml=yaml(typ='safe')
yaml=yaml(typ='safe')
,并且您希望基于C的加载程序和转储程序能够加快速度,那么您应该考虑使用PyPI上提供的Windows
.whl
文件。它们包括
\u ruamel\u yaml.cpXY-win\u NNN.pyd
文件。如果您不知道您的目标(python和/或win32 | win | amd64,您应该能够包含所有这些,并且
ruamel.yaml
将在启动时选择正确的一个(实际上它只从| ruamel | yaml import CParser,CEmitter
执行
,并假设python解释器知道该做什么).

好的,我找到了一个解决方案。我认为这可能是CX\u Freeze中的一个bug。如果我pip安装ruamel.base和ruamel.yaml,CX\u Freeze似乎可以正确安装所有内容。这是真的,即使我要求它只包含ruamel.yaml

如果我同时安装了ruamel.base和ruamel.yaml,那么这就行了

build_exe_options = {
    ...
    "namespace_packages": ["ruamel.yaml"]
    ...
}
cx_Freeze.setup(
    ...
    executables=[cx_Freeze.Executable("pyhathiprep/__main__.py",
                              targetName="pyhathiprep.exe", base="Console")],
)

我在azure上也遇到了同样的问题。问题是microsoft构建azure包的方式-您可以导入azure.something.something\u else.module,但您不能直接导入azure。cx\u freeze需要能够直接找到azure文件夹(或者在您的情况下,找到文件夹ruamel),而不仅仅是子文件夹

我必须去我访问的azure文件夹下的每个目录,确保那里有一个init.py文件。在那之后,cx\U freeze能够完美地找到它

另一种选择是直接将文件夹从您知道的路径(直接链接到您的网站包,或将ruamel目录复制到您的程序目录并从那里复制)复制到构建文件夹中,作为安装的一部分。我这样做是为了我的数据文件:

import shutil
shutil.copytree("icons","build/exe.win32-3.6/icons")

您是否尝试过作为
“包”导入:[“ruamel”]
?是的。它会给我一条异常消息“ImportError:没有名为“ruamel”的模块”@预计为loneraver,因为没有包装
ruamel
PyPI@Anthon,是的!我当时正在绞尽脑汁想弄明白,所以我就到了想尝试任何东西的地步。所以我无论如何都尝试了。尽管我知道你是维护者,但我可以验证你是正确的。:-)我尝试搜索
pyhathiprep
,试着看看你在做什么,并在谷歌上找到一个结果。我有最新版本的pip和setuptools,这就是我安装它的方式。当我正常使用它时,它就工作了。我想我刚刚想出了一个办法让它冻结。一旦我能确认我能复制它,我马上就发布它。我刚看了CX_freeze文档,你可能就可以从你的
setup.py
文件
ruamel.base
在目录
ruamel
中提供一个
\uu init\uuuuuuuuuuuuuuy
文件,这可能就是让CX_冻结加载的原因。您真的是在正常的环境中安装,并且正在运行
python setup.py build
?或者您是否将
ruamel.base
添加到
setup.py
中,因为这里的IT部门要求我以捆绑的.msi安装程序的形式交付所有内容(因此cx\u冻结),我有2个setup.py。首先,我有一个普通的setup.py,它使用setuptools,这使得Tox等的开发非常好。其次,我还有一个cx_setup.py,它创建了.msi独立发行版。正常的setuptools setup.py不需要显式添加ruamel.base来安装ruamel.yaml。也许您可以在此处显示软件包(包括
ruamel.base
),作为工作版本的一部分。
import shutil
shutil.copytree("icons","build/exe.win32-3.6/icons")