- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在使用 python 的设置工具进行奇怪的 150 毫秒启动惩罚,我构建了一个最小的测试用例,但问题仍然存在:
这个最小案例的项目布局是:
- setup.py
- setuptest
- - __init__.py
- - __main__.py
setup.py 文件包含:
from setuptools import setup
setup(
name = 'setuptest',
version = '0.1',
packages = ['setuptest'],
entry_points = {
'console_scripts' : ['setuptest = setuptest.__main__:main']
} ,
)
__main__.py 文件只包含:
#!/usr/bin/env python2
def main ():
print "hai"
if __name__ == '__main__':
main()
在项目根目录中执行此操作:
—— — time python2 setuptest
hai
real 0m0.021s
user 0m0.017s
sys 0m0.004s
总脚本执行时间为 21 毫秒,但是,在运行 sudo python2 setup.py install
并执行以下操作后:
—— — time setuptest
hai
real 0m0.158s
user 0m0.144s
sys 0m0.012s
—— —
给我 158 毫秒。这 +150 秒的启动延迟时间是一致的,并且在我使用 setuptools 时全面发生,但不会发生在我通过包管理器安装的东西或手动安装其他人的项目时,这让我觉得我'我显然做错了什么。
最佳答案
好吧,当您使用 setuptools 安装软件时,它会在 bin
目录中生成可执行脚本,如下所示:
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.exit(
load_entry_point('<PACKAGE_NAME>', 'console_scripts', '<ENTRY_POINT>')()
)
因为 load_entry_point()
将解析 sys.path
中可用的所有包,您安装的位置和包越多,构建列表所需的时间就越长,然后查找。
有关更多详细信息,我们需要查看 setuptools 的 load_entry_point()
实现:
来自 setuptools.py:load_entry_point()
:
def load_entry_point(dist, group, name):
"""Return `name` entry point of `group` for `dist` or raise ImportError"""
return get_distribution(dist).load_entry_point(group, name)
来自 'setuptools.py:get_distribution()' :
def get_distribution(dist):
"""Return a current distribution object for a Requirement or string"""
if isinstance(dist,basestring): dist = Requirement.parse(dist)
if isinstance(dist,Requirement): dist = get_provider(dist)
if not isinstance(dist,Distribution):
raise TypeError("Expected string, Requirement, or Distribution", dist)
return dist
来自 setuptools.py:Distribution.load_entry_point()
:
def load_entry_point(self, group, name):
"""Return the `name` entry point of `group` or raise ImportError"""
ep = self.get_entry_info(group,name)
if ep is None:
raise ImportError("Entry point %r not found" % ((group,name),))
return ep.load()
来自 setuptools.py:Distribution.get_entry_info()
:
def get_entry_info(self, group, name):
"""Return the EntryPoint object for `group`+`name`, or ``None``"""
return self.get_entry_map(group).get(name)
我会把它留在那里,你可以跟进到它变得昂贵的地方。我猜 Distribution
中的方法映射完成的位置(如 _dep_map
属性)在执行时可能会非常昂贵。
关于python - 奇怪的 ~150ms 启动惩罚使用 python setuptools,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36067138/
我目前正在使用 centos 网络管理。我尝试将默认的 python 版本从 2 更改为 3。我已经完成了,您可以从下面的结果中看到: [root@srv ~]# which python /usr/
我无法在 ubuntu 中使用命令行安装 setuptools。我使用了“pip install setuptools”,但它显示错误: Exception: Traceback (most rece
我正在一台新的 Mac 上进行设置,我一直在嗡嗡作响,安装了 pip 和一些软件包。突然间,我尝试运行的每个 pip 命令都会抛出 Exception: Traceback (most recent
我赢了10场。运行时:。我遇到了这个错误:。似乎什么都没有帮助。我试着卸载蟒蛇,得到了一个成功的消息,但似乎有一些旧版本的痕迹仍然存在。我怎样才能完全抹去蟒蛇安装的所有痕迹?
安装时出现此错误。这会导致问题吗? 错误:tensorboard 2.0.2 要求 setuptools>=41.0.0,但您将拥有不兼容的 setuptools 40.6.2。 最佳答案 我刚刚做了
我的 pacakge 有 *.py 文件和 *.c 文件,*.py 文件使用 ctypes 导入共享库 从 c 源构建。 现在我遇到了如何编写 setup.py 的问题。 setup脚本需要将my_c
python中安装包的方式有很多种: 源码包:python setup.py install 在线安装:pip install 包名(linux) / easy_install 包名(
我刚刚更新了一个包以使用 setuptools_scm,并发现 readthedocs 中的版本号错误。 http://sshuttle.readthedocs.org/en/v0.77/显示: Ve
我的项目有下面的包树 └── src | ├── mypkg1 | │ ├── module1.py | │ ├── module2.py | │ └── __in
我的项目有下面的包树 └── src | ├── mypkg1 | │ ├── module1.py | │ ├── module2.py | │ └── __in
我的 Python 模块包含一个外部脚本,用户可以从命令行执行该脚本。我希望用户能够一次性安装 Python 模块和脚本。使用setuptools,我尝试添加: scripts=['bin/mybin
我对 python 中的设置工具还不太熟悉。我最近向我的项目添加了一个依赖项并遇到了依赖项的问题。问题是: try: from setuptools import setup except I
假设我有一个 setuptools 项目依赖于 PyPi 包 A,1.0 版。 PyPi 包 B,1.0 版。 包 B 依赖于 A,v. 2.0。 在 Java 中,我必须排除 pom.xml 或类似
我有一个 Python 脚本,有几个外部依赖项,我想分发给同事。但是,我们需要定期修改此脚本,所以我不想安装本身(即复制到 site-packages)。据我所知,setuptools 似乎隐含地执行
我正在为一个 python 项目设置一个持续交付系统,我正在尝试弄清楚如何通过 egg_info 设置项目构建的整个版本字符串。 我正在使用 thoughtworks GO,它有一个名为 GO_PIP
我在 setup.py 中有以下内容: from setuptools import setup # ... setup( name='xml-boiler', version='0.
当我运行我的应用程序时,我的应用程序引擎日志给我这个错误: WARNING 2012-03-01 23:27:31,089 py_zipimport.py:139] Can't open zipfi
我正在使用 setuptools 打包一个 python 应用程序,通常运行 python setup.py install 并将所有内容打包到一个 egg 中并安装它。 问题是我希望将它安装为可编辑
我无法卸载设置工具。怎么会? $ sudo pip uninstall setuptools Can't uninstall 'setuptools'. No files were found to
我想支持一个界面,新开发人员只需运行 python setup.py test 即可运行我的所有测试。我认为这是合理的。 鉴于我在我的包中定义了几个“额外”(optional features wit
我是一名优秀的程序员,十分优秀!