Python 用ruamel.yaml冷冻CX_
我无法让CX_Freeze将包ruamel.yaml包含在build_exe中 我还尝试将其添加到“packages”选项中,如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
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")