Pytest-django: Windows:OSError:[WinError 123] 由于路径库更改

创建于 2018-08-29  ·  12评论  ·  资料来源: pytest-dev/pytest-django

我的pytest.ini有以下内容:

[pytest]
DJANGO_SETTINGS_MODULE = project.settings_pytest
addopts = --doctest-modules --cov=. --cov-report html:./coverage/python/html
norecursedirs = .git .venv .vscode node_modules

我相信传递给--cov-report的类 Unix 路径导致最新版本的 pytest-django 在 Windows 上崩溃。 (因为它在.ini文件中,我不知道有任何平台无关的方式来指定它)。

这是运行pytest时显示的回溯:

Traceback (most recent call last):
  File "C:\Program Files\Python37\Lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Program Files\Python37\Lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\Atul\.virtualenvs\tenants2-Gxdtcl1v\Scripts\pytest.exe\__main__.py", line 9, in <module>
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 55, in main
    config = _prepareconfig(args, plugins)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 180, in _prepareconfig
    pluginmanager=pluginmanager, args=args
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\hooks.py", line 258, in __call__
    return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\manager.py", line 67, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\manager.py", line 61, in <lambda>
    firstresult=hook.spec_opts.get('firstresult'),
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 196, in _multicall
    gen.send(outcome)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\helpconfig.py", line 89, in pytest_cmdline_parse
    config = outcome.get_result()
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 76, in get_result
    raise ex[1].with_traceback(ex[2])
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 180, in _multicall
    res = hook_impl.function(*args)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 612, in pytest_cmdline_parse
    self.parse(args)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 777, in parse
    self._preparse(args, addopts=addopts)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 739, in _preparse
    early_config=self, args=args, parser=self._parser
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\hooks.py", line 258, in __call__
    return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\manager.py", line 67, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\manager.py", line 61, in <lambda>
    firstresult=hook.spec_opts.get('firstresult'),
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 201, in _multicall
    return outcome.get_result()
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 76, in get_result
    raise ex[1].with_traceback(ex[2])
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 180, in _multicall
    res = hook_impl.function(*args)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pytest_django\plugin.py", line 209, in pytest_load_initial_conftests
    _django_project_scan_outcome = _add_django_project_to_path(args)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pytest_django\plugin.py", line 140, in _add_django_project_to_path
    project_dir = find_django_path(args)
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pytest_django\plugin.py", line 127, in find_django_path
    args = [p for p in args if p.is_dir()]
  File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pytest_django\plugin.py", line 127, in <listcomp>
    args = [p for p in args if p.is_dir()]
  File "C:\Program Files\Python37\Lib\pathlib.py", line 1330, in is_dir
    return S_ISDIR(self.stat().st_mode)
  File "C:\Program Files\Python37\Lib\pathlib.py", line 1140, in stat
    return self._accessor.stat(self)
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'html:.\\coverage\\python\\html'

所有12条评论

似乎是由于切换到pathlib。

/cc @voidus

尝试--cov-report=html:./coverage/python/html作为解决方法。

嗨,我也有 pytest 的问题。\app\tests.py::WebServiceTest

解决方法有效吗?

你好
OSError: [WinError 123] Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch: 'app\tests.py::WebServiceTest'
(错误文本是德语)

这是我的 pytest.ini 文件。 没有覆盖的东西。

[测试]
DJANGO_SETTINGS_MODULE = DjangoBasisLager.settings
python_files = tests.py tests_*.py *_tests.py

问题在于测试文件的路径。

完整的错误日志:
(DjangoBasisLager--RYvLsCA) PS C:UsersLubitzworkspacebasislagerDjangoBasisLager> pytest .\app\tests.py::WebServiceTest
回溯(最近一次调用最后一次):
_run_module_as_main 中的文件“C:Program FilesPython36Librunpy.py”,第 193 行
"__main__", mod_spec)
_run_code 中的文件“C:Program FilesPython36Librunpy.py”,第 85 行
exec(代码,run_globals)
文件“C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAScriptspytest.exe__main__.py”,第9行,在
文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py”,第56行,主
config = _prepareconfig(args, plugins)
_prepareconfig 中的文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py”,第 181 行
插件管理器=插件管理器,args=args
文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggyhooks.py”,第258行,在__call__
返回 self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggymanager.py”,第 67 行,在 _hookexec
返回 self._inner_hookexec(钩子,方法,kwargs)
文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggymanager.py”,第61行,在
firstresult=hook.spec_opts.get('firstresult'),
文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggycallers.py”,第 196 行,在 _multicall
gen.send(结果)
文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytesthelpconfig.py”,第 89 行,在 pytest_cmdline_parse 中
配置 = 结果.get_result()
文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggycallers.py”,第76行,在get_result中
提高 ex[1].with_traceback(ex[2])
文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggycallers.py”,第 180 行,在 _multicall
res = hook_impl.function( args)文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py”,第 617 行,在 pytest_cmdline_parse 中self.parse(args)文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py”,第782行,解析self._preparse(args, addopts=addopts)文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py”,第 744 行,在 _preparse 中early_config=self, args=args, parser=self._parser文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggyhooks.py”,第258行,在__call__返回 self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggymanager.py”,第 67 行,在 _hookexec返回 self._inner_hookexec(钩子,方法,kwargs)文件“c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggymanager.py”,第61行,在






参数)
文件“C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAlibsite-packagespytest_djangoplugin.py”,第 209 行,在 pytest_load_initial_conftests
_django_project_scan_outcome = _add_django_project_to_path(args)
文件“C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAlibsite-packagespytest_djangoplugin.py”,第140行,_add_django_project_to_path
project_dir = find_django_path(args)
文件“C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAlibsite-packagespytest_djangoplugin.py”,第127行,在find_django_path
args = [p for p in args if p.is_dir()]
文件“C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAlibsite-packagespytest_djangoplugin.py”,第127行,在
args = [p for p in args if p.is_dir()]
文件“C:Program FilesPython36Libpathlib.py”,第 1346 行,在 is_dir 中
返回 S_ISDIR(self.stat().st_mode)
文件“C:Program FilesPython36Libpathlib.py”,第 1156 行,在 stat
返回 self._accessor.stat(self)
文件“C:Program FilesPython36Libpathlib.py”,第 387 行,已包装
返回 strfunc(str(pathobj), *args)
OSError: [WinError 123] Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch: 'app\tests.py::WebServiceTest'

啊,我明白了..它会为你触发一个普通的 arg。

@voidus
你能考虑解决这个问题吗?

嗨,我能以任何方式帮助解决问题吗? 是否有我可以测试的早午餐,或者我应该调查问题来解决它吗?

@pinguin999
没什么可测试的。
它与添加的 pathlib 代码有关(请参阅您的堆栈跟踪)。
如果您可以提供修复程序的 PR,那就太好了。

@pinguin999我不确定这个错误的原因是什么,但我怀疑测试类规范( ::WebServiceTest )可能是它。

我创建了一个分支,在运行测试之前,该部分被拆分,如果您可以尝试一下,那就太好了,因为我没有可用的开发设置的 Windows 机器。 您可以在https://github.com/voidus/pytest-django 的fork 中的oserror_pathlib分支中找到它

https://github.com/voidus/pytest-django/tree/oserror_pathlib

是的,显然 arg 中的“:”在 Windows 上是有效的。
我认为你的补丁很好,我已经用它创建了https://github.com/pytest-dev/pytest-django/pull/648

你好
对不起,我在假期。
我更新到 3.4.3 并且它正在工作。

谢谢你

# 删除这行代码 ====== 'module_name',
来自 INSTALLED_APPS 列表

嗯,这也发生在我身上。
首先确保您在项目文件夹中启动应用程序
例如:
"django-admin startproject 网站
光盘网站
django-admin startapp 音乐”

此页面是否有帮助?
0 / 5 - 0 等级