Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python、setuptools、控制盘、入口点、.exe Windows包装器和多处理_Python_Windows_Multiprocessing_Setuptools_Python Wheel - Fatal编程技术网

Python、setuptools、控制盘、入口点、.exe Windows包装器和多处理

Python、setuptools、控制盘、入口点、.exe Windows包装器和多处理,python,windows,multiprocessing,setuptools,python-wheel,Python,Windows,Multiprocessing,Setuptools,Python Wheel,TL;博士;-setuptools/distutils脚本包装器.exe入口点不会触发Windows多处理无限递归。Wheel的wrapper.exe入口点是什么。我怎样才能得到以前的行为 在直接调用模块脚本时,我们中的许多人可能都遇到过Python2.X的多处理模块和具有无限递归的窗口的问题 当我为我的库创建了一个入口点,从而生成了一个具有多处理功能的函数时,入口点脚本及其包装.exe文件在我使用setuptools安装它们时都可以在Windows上运行,可以直接运行调用多处理.Pool和Pr

TL;博士;-setuptools/distutils脚本包装器.exe入口点不会触发Windows多处理无限递归。Wheel的wrapper.exe入口点是什么。我怎样才能得到以前的行为

在直接调用模块脚本时,我们中的许多人可能都遇到过Python2.X的多处理模块和具有无限递归的窗口的问题

当我为我的库创建了一个入口点,从而生成了一个具有多处理功能的函数时,入口点脚本及其包装.exe文件在我使用setuptools安装它们时都可以在Windows上运行,可以直接运行调用多处理.Pool和Process对象的函数。这很好,因为我的库依赖于多处理来加速可耻的并行程序

事情一直进展顺利,直到我尝试使用bdist_wheel共享图书馆。尽管构建过程之前对外添加了.exe包装器和脚本,但.exe不是同一种包装器

我的二进制文件格式技能还远远不够好,但我知道有一种将zip压缩文件转换为我看到的可执行文件的方法,所以我去做了唯一合乎逻辑的事情,并解压缩了.exe文件。我使用7zip,因为即使是我的mingw bash shell也没有zip/unzip。从控制盘文件安装的.exe包装器解压缩到包含简单main.py脚本的目录中

# -*- coding: utf-8 -*-
import re
import sys

from example_multiprocessing.runner import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
这只是一个从zip文件运行的python脚本。难怪它爆炸了

我使用setup.py重新安装,添加了旧的wrapper.exe,并尝试解压缩它。瞧,这是一个完全可移植的可执行文件,其中.data、.pdata、.rdata和.text部分由7zip提取到自己的文件中。两个小时后,我翻阅了distutils和setuptools的源代码,以了解那里发生了什么,并发现我看到的.exe是通过将一些特定于入口点的python代码注入为Windows制作的预封装启动程序exe中生成的。伟大的我知道的比以前多。但是如果区别在于.exe包装,为什么-script.py入口点可以工作

__requires__ = 'example-multiprocessing==1.0.2'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('example-multiprocessing==1.0.2', 'console_scripts', 'example-mp-run')()
    )
load\u entry\u point
特殊吗?它是EntryPoint.load()的包装器,用于显式调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

# From [https://bitbucket.org/pypa/pkg_resources/src/33e56f318f5086158de8bb2827acb55db2dbc153/pkg_resources.py?at=default#cl-2258][1]
def load(self, require=True, env=None, installer=None):
    if require: self.require(env, installer)
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
    for attr in self.attrs:
        try:
            entry = getattr(entry,attr)
        except AttributeError:
            raise ImportError("%r has no %r attribute" % (entry,attr))
    return entry
globals()
看起来像是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu导入
文档中的死路一条,但是
['''\uuuuuuuuuuuuuuuuuuu。问题是,
\uuuuu import\uuuuu
是一个内置函数,它是用C实现的。我曾试图阅读上面发布的镜像,但目前它超出了我的知识范围,分成了三个或更多的交互函数,我无法跟踪这些函数并与fromlist保持连接。我也可能会被
\uuuu import\uuuu
分心,因为下一个块尝试访问
entry
中存储的模块属性,我推断该属性本身就是入口点函数

当我运行以下代码时:

getattr(__import__("example_multiprocessing.runner", globals(), globals(), ["__name__"]), "main")()
我确实看到了我希望在其中运行的主函数,它可以执行,并且返回时不会出现问题


\uuuuuu import\uuuuu
是否真的完成了我需要的工作,将脚本的
\uuuu name\uuuuuu
设置为不包含
\uuuu main\uuu
的内容?为什么-m背后的机器runpy不工作?

我已经在上对pip公开了这个问题。根据Nick Coghlan的说法,Python2.7上的多处理和
\uuuu main\uuuu
从根本上被破坏了,不会被修复。希望带轮子的pip很快能换成另一种发射技术。谢谢。我真的应该在几个月前亲自去做。我自己也得出了同样的结论,并编写了脚本,作为程序受影响方面的入口点包装器,显式地使用
\uuuu import\uuuu
加载使用
多处理的模块。这将在Python 2.7.11中得到修复:)