pytest (py.test) 在 cygwin 中启动非常慢

2023-12-12

在 cygwin 中,py.test 启动非常慢。由于两个原因,它看起来不像是一个收集问题: 相同的测试在 Linux 中启动得很快。有时,如果在 cygwin 中足够快地重新运行相同的测试,它会在不到 1 秒的时间内启动。运行 time 命令告诉它在 0.4 秒或 11.7 秒内启动(当提供时)--collection-only避免运行实际测试的选项。我还在挂钩上添加了印花pytest_configure() and pytest_ignore_collect()可以肯定的是,这确实是在收集开始之前。

还有其他问题,linke如何加速 py.test等等,但我还没有看到为什么在cygwin下它很慢,以及如何解决这个问题。

Update:通过分析运行它python -m cProfile -s cumulat ~/.../py.test conftest.py。以下是结果中的前 20 名。我倾向于认为这是问题所在posix.stat在 cygwin 或 cygwin python 包中,或者exists and isfile在不同的地方。

   104699 function calls (102659 primitive calls) in 12.223 CPU seconds
   Ordered by: cumulative time
 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      1    0.016    0.016   12.223   12.223 {execfile}
      1    0.000    0.000   12.223   12.223 <string>:1(<module>)
      1    0.000    0.000   12.207   12.207 py.test:4(<module>)
      1    0.000    0.000   12.051   12.051 config.py:23(main)
  48/22    0.000    0.000   12.051    0.548 core.py:526(_docall)
  48/22    0.000    0.000   12.051    0.548 core.py:520(__call__)
 129/82    0.000    0.000   12.051    0.147 core.py:387(execute)
      1    0.000    0.000   11.926   11.926 config.py:634(pytest_cmdline_parse)
      1    0.000    0.000   11.926   11.926 config.py:70(_prepareconfig)
      1    0.000    0.000   11.926   11.926 config.py:741(parse)
    4/3    0.000    0.000   11.926    3.975 core.py:97(wrapped_call)
    4/3    0.000    0.000   11.926    3.975 core.py:121(__init__)
      1    0.000    0.000   11.911   11.911 config.py:706(_preparse)
     70    0.000    0.000   11.817    0.169 local.py:363(check)
    260   11.817    0.045   11.817    0.045 {posix.stat}  <<<<this one???
      1    0.000    0.000    9.302    9.302 config.py:698(_initini)
      1    0.000    0.000    9.286    9.286 config.py:896(determine_setup)
    188    0.000    0.000    9.286    0.049 genericpath.py:15(exists)  <<<<this one???
     18    0.000    0.000    6.861    0.381 config.py:845(exists)  <<<<this one???
      1    0.000    0.000    6.861    6.861 config.py:851(getcfg)  <<<<this one???
      1    0.000    0.000    2.531    2.531 config.py:694(pytest_load_initial_conftests)
      1    0.000    0.000    2.531    2.531 config.py:477(setinitial)
      1    0.000    0.000    2.531    2.531 config.py:503(_try_load_conftest)
     13    0.000    0.000    2.531    0.195 config.py:511(getconftestmodules)
     32    0.000    0.000    2.531    0.079 genericpath.py:26(isfile)  <<<<this one???
      8    0.000    0.000    2.425    0.303 common.py:261(exists)
      1    0.000    0.000    0.156    0.156 pytest.py:4(<module>)
      1    0.000    0.000    0.125    0.125 main.py:73(wrap_session)
      1    0.000    0.000    0.125    0.125 config.py:615(do_configure)
      1    0.000    0.000    0.125    0.125 main.py:115(pytest_cmdline_main)

关于分析中排序的注意事项:很难弄清楚要使用什么关键字。添加一行以打印出sort_arg_defs in pstats.py可以给出一个想法:

$ cat -n /usr/lib/python2.x.x/pstats.py
214         sort_arg_defs = self.get_sort_arg_defs()
215         sort_tuple = ()
216         self.sort_type = ""
217         connector = ""
218         for word in field:
219             sort_tuple = sort_tuple + sort_arg_defs[word][0]
220             self.sort_type += connector + sort_arg_defs[word][1]
221             connector = ", "

结论总结:格式错误的文件路径,例如//setup.py(应该是/setup.py开头没有双斜杠),揭示了四个软件部分之一的问题:pytest config.define_setup()、pytest config 使用的 py.path、cygwin python 库或 cygwin posix 实现。


问题是 pytest 搜索//pytest.ini, //tox.ini, //setup.cfg, and //setup.py。他们每个人都造成了genericpath.exists() or genericpath.isfile()消耗约2.5秒。

修复方法是将下面的行添加到genericpath.exists() and genericpath.isfile()跳过这四个特定路径。

if path.startswith(r'//'):
    return False

另一种修复方法是修改_pytest/config.py所以它不会在搜索路径中形成那些双斜杠。

用于找出确切问题的代码粘贴在下面。放myshow = True因此它将显示正在搜索的每个文件的时间消耗情况。

$ diff -u /usr/lib/python2.6/genericpath.py genericpath.py
--- /usr/lib/python2.6/genericpath.py   2012-06-09 08:33:12.000000000 -0700
+++ genericpath.py      2015-06-11 11:46:33.674285900 -0700
@@ -9,14 +9,29 @@
 __all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime',
            'getsize', 'isdir', 'isfile']

+myshow = False
+import time as mytime
+mybasetime = mytime.time()
+def myshowtime():
+    currenttime = mytime.time()
+    tmdiff = currenttime - mybasetime
+    global mybasetime
+    mybasetime = currenttime
+    return tmdiff

 # Does a path exist?
 # This is false for dangling symbolic links on systems that support them.
 def exists(path):
     """Test whether a path exists.  Returns False for broken symbolic links"""
+    pretime = myshowtime()
+    if path.startswith(r'//'):
+        if myshow: print "\n  genericpath exists  %8.3f %8.3f False " % (pretime, myshowtime()), " ", path, "\n"
+        return False
     try:
         st = os.stat(path)
+        if myshow: print "\n  genericpath exists  %8.3f %8.3f True  " % (pretime, myshowtime()), " ", path, "\n"
     except os.error:
+        if myshow: print "\n  genericpath exists  %8.3f %8.3f False " % (pretime, myshowtime()), " ", path, "\n"
         return False
     return True

@@ -25,9 +40,15 @@
 # for the same path ono systems that support symlinks
 def isfile(path):
     """Test whether a path is a regular file"""
+    pretime = myshowtime()
+    if path.startswith(r'//'):
+        if myshow: print "\n  genericpath isfile  %8.3f %8.3f False " % (pretime, myshowtime()), " ", path, "\n"
+        return False
     try:
         st = os.stat(path)
+        if myshow: print "\n  genericpath isfile  %8.3f %8.3f True  " % (pretime, myshowtime()), " ", path, "\n"
     except os.error:
+        if myshow: print "\n  genericpath isfile  %8.3f %8.3f False " % (pretime, myshowtime()), " ", path, "\n"
         return False
     return stat.S_ISREG(st.st_mode)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytest (py.test) 在 cygwin 中启动非常慢 的相关文章

  • Google App Engine queue.yaml 无法在开发服务器中工作

    我无法让 dev appserver py 识别我使用queue yaml 创建的自定义队列 他们没有出现在http localhost 8000 taskqueue http localhost 8000 taskqueue 当我尝试向其
  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • 如何在python 3.7中生成条形码

    我正在使用 python 3 7 为了生成条形码 我尝试使用安装 pyBarcode 库pip install pyBarcode 但它显示以下错误 找不到满足 pyBarcode 要求的版本 来自版本 找不到 pyBarcode 的匹配分
  • Sublime Text 插件开发中的全局 Python 包

    一 总结 我不知道 Sublime Text 插件开发人员如何使用 Sublime Text 查找全局 Python 包 而不是 Sublime Text 目录的 Python 包 Sublime Text使用自己的Python环境 而不是
  • Kivy - 有所有颜色名称的列表吗?

    在 Kivy 中 小部件 color属性允许输入其值作为字符串颜色名称 也 例如在 kv file Label color red 是否有所有可能的颜色名称的列表 就在这里 来自Kivy 的文档 https kivy org doc sta
  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • Gspread如何复制sheet

    在 Stackoverflow 上进行谷歌搜索和搜索后 我想我找不到有关如何复制现有工作表 现有模板工作表 并将其保存到另一个工作表中的指南 根据文档 有重复表 https gspread readthedocs io en latest
  • Django 的 request.FILES 出现 UnicodeDecodeError

    我在视图调用中有以下代码 def view request body u for filename f in request FILES items body body Filename filename n f read n 在某些情况下
  • Python新式类和__subclasses__函数

    有人可以向我解释为什么这有效 在 Python 2 5 中 class Foo object pass class Bar Foo pass print Foo subclasses 但这不是 class Foo pass class Ba
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • Python:IndexError:修改代码后列表索引超出范围

    我的代码应该提供以下格式的输出 我尝试修改代码 但我破坏了它 import pandas as pd from bs4 import BeautifulSoup as bs from selenium import webdriver im
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • 将seaborn.palplot轴添加到现有图形中以可视化不同调色板

    将seaborn人物添加到子图中是usually https seaborn pydata org examples cubehelix palette html创建图形时通过传递 ax 来完成 例如 sns kdeplot x y cma
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练

随机推荐

  • Vba 代码在工作簿打开后停止。没有错误

    我有一些代码旨在打开 xlsm 工作簿 从中复制一些数据并将其与代码一起粘贴到工作簿中 两个工作簿均受密码保护 代码也受密码保护 我有一些代码设置为在保存 打开和关闭之前运行 从而锁定工作簿 所以问题是 在通过 vba 打开工作簿后 代码停
  • 在 BlackBerry 中创建自定义布局

    我想在屏幕的下半部分创建一个 RichTextField 同时在屏幕的上半部分绘制自己的自定义图形 这在黑莓手机中可能吗 它尝试定义 LayoutManager 并尝试将 RichTextField 定位在屏幕底部 但 RichTextFi
  • 为什么JVM可以自行从OOM Java堆空间中恢复

    Integer data new Integer 1000000 100000 如上面的简单演示代码 我尝试在 pandora 容器 它是阿里巴巴开发的 Web 容器 如 tomcat 中申请显着的大内存并触发 OOM 但似乎此错误仅影响当
  • 如何切换“使用自动配置脚本”

    WhoIsRich 发布了一个很棒的脚本来切换自动检测设置 你能告诉我如何设置使用自动配置脚本吗 原文发布于Windows 注册表中的哪个键禁用 IE 连接参数 自动检测设置 To set reg add HKCU Software Mic
  • [::-1] 在 python 中意味着什么 - 切片?

    我有一个变量a range 0 5 我需要知道why and how a 1 这有效 我得到的答案是range 4 1 1 感谢帮助 P S 这是一个非常基本的问题 但由于这个问题是以非常结构化的方式回答的 我尝试编辑这个问题并使其更加普遍
  • 在云托管上部署 Laravel 5.1

    我在 wamp 上开发了我的 laravel 应用程序 终于搞定了 租了一台带有CPanel接口的云托管服务器 我将所有文件上传到公共 html 上并尝试访问该网站 它应该进入登录页面但不起作用 我曾经部署经典的 html 文件 这是我第一
  • 单个字符的标签样式

    我需要更改此标签中一个字符的颜色 特别是 这需要对几个部分进行更改 但对其他许多部分则不需要更改 有没有一种内联方式可以让我做到这一点 td td
  • glassfish 命名中未找到 SerialInitContextFactory

    这开始让我彻底发疯 我想使用 Maven 创建一个 Glassfish 客户端应用程序 为此 我添加了所需的 gf client 依赖项
  • 为什么在 BIOS 中禁用超线程的 Broadwell CPU 上,perf stat 不计算周期:u?

    鉴于 BIOS 中禁用超线程的 Broadwell CPU root ny4srv03 lscpu Architecture x86 64 CPU op mode s 32 bit 64 bit Address sizes 46 bits
  • 如何将自定义列表视图设置到对话框中

    我正在开发一个应用程序 它从网络服务中获取一些数据并显示在列表视图中 我已经实现了一个由 BaseAdapter 扩展的自定义适配器 在里面getView 我也给原料充气的方法 这些工作得很好 我的问题是我已经实现了代码来在用户单击列表项时
  • 使用变量作为名称向 JavaScript 对象添加属性?

    我正在使用 jQuery 从 DOM 中提取项目 并希望使用以下方法在对象上设置属性idDOM 元素的 Example const obj jQuery itemsFromDom each function const element jQ
  • 如何使用 d3.js 创建定义列表?

    我正在尝试创建一个定义列表 如下所示 dl dt term1 dt dd definition1 dd dt term2 dt dd definition2 dd dt term3 dt dd definition3 dd dl 通过使用以
  • iOS 企业开发 - TestFlight

    我今天早上刚收到一封电子邮件 称 testflightapp com 从 2015 年 2 月 26 日起将不再活跃 我应该改用 iTunes Connect TestFlight 服务 对于应用程序商店应用程序来说 这很好 但我的大多数项
  • 自定义 Windows 文件夹图标

    Skype 在 C Program Files 中的 Skype 文件夹中有一个漂亮的自定义文件夹图标 如何为特定 Windows XP 及更高版本 文件夹注册自定义图标 使用 Desktop ini 自定义文件夹
  • CSS 如何在图像底部添加文本标题?

    我对 css 很陌生 我试图在图像底部添加文本标题 如下所示 我在 3 个不同的引导列中有 3 个图像 img preview display block margin 0 auto object fit cover min height
  • 线条颜色取决于趋势

    我正在尝试绘制一条线 该线应该以代表图表趋势的方式着色 例如 如果它正在增加 它应该是绿色的 而如果它正在减少 它应该是红色的 我可以简单地使用移位的数据框来表示这种趋势绘制点 dates 2018 01 format d for d in
  • mssql server 2008 的分页查询在“OFFSET”附近抛出错误的语法

    我正在 jsp 中进行分页 而且我是编写 sql 的新手 我做了研究并发现了简单的查询 SQL Server 2008 中的分页 and 如何在SQL Server 2008中进行分页 SELECT FROM document ORDER
  • 如何测试 cron 作业?

    我使用的是 Ubuntu Linux 10 0 4 我想每天每 6 小时运行一个脚本 当我发出sudo crontab e 我懂了 m h dom mon dow command 00 06 12 18 opt scripts seleni
  • 带有 tkinterdnd2 模块的 *.py 脚本不会编译为可执行文件

    我制作了一个使用 tkinter 和 tkinterdnd 模块的应用程序 当我将其作为脚本启动时 它工作得很好 但是当我尝试从中创建可执行文件并启动它时 会出现以下错误 Traceback most recent call last Fi
  • pytest (py.test) 在 cygwin 中启动非常慢

    在 cygwin 中 py test 启动非常慢 由于两个原因 它看起来不像是一个收集问题 相同的测试在 Linux 中启动得很快 有时 如果在 cygwin 中足够快地重新运行相同的测试 它会在不到 1 秒的时间内启动 运行 time 命