如何通过 tox 将 *.py 传递给 pycco?

How can I pass *.py to pycco via tox?

以下命令有效:

$ pycco *.py
# generates literate-style documentation
# for all .py files in the current folder

我的 tox.ini 文件中的以下片段按预期工作:

[testenv:pycco]
deps =
    pycco
commands =
    pycco manage.py
# generates literate-style documentation
# for manage.py

但如果我尝试使用 glob:

[testenv:pycco]
deps =
    pycco
commands =
    pycco *.py

...我收到以下错误:

  File "/home/user/Documents/project/.tox/pycco/lib/python3.7/site-packages/pycco/main.py", line 79, in generate_documentation
    code = open(source, "rb").read().decode(encoding)
FileNotFoundError: [Errno 2] No such file or directory: '*.py'

如何通过 tox 将 *.py 传递给 pycco?

您不能直接执行此操作,因为 pycco(当前)不支持 glob 扩展。相反,您可以创建一个 shell 脚本 execute_pycco.sh,如下所示:

#!/bin/sh

pycco *.py

更新tox.ini如下:

[testenv:pycco]
deps =
    pycco
commands =
    ./execute_pycco.sh

您现在将在 tox 创建的 "pycco" 环境中执行您的 shell 脚本。此方法还允许您定义更复杂的脚本:

#!/bin/sh

filelist=$( find . -name '*.py' | grep -v ".tox" )
# make a list of all .py files in all subfolders,
# except the .tox/ subfolder

pycco -ip $filelist
# generate literate-style documentation for all
# files in the list

这里的问题是pycco不支持glob扩展。 pycco *.py 之所以起作用,是因为在执行之前 shell 实际上将 *.py 转换为实际文件;然后将其传递给 OS 到 运行 它。

当 tox 运行s 你的命令没有 shell 涉及,所以无论你写什么都传递给 OS,所以现在 pycco 实际上作为参数 *.py 因此错误。

您可以通过显式列出文件路径或使用 python 解释器进行扩展来解决此问题:

python -c 'from glob import glob; import subprocess; subprocess.check_call(["pycco"] + glob("*.py"))'

将上述命令放入您的 tox 命令中,现在一切正常,因为 python 现在是 shell 将“*.py”扩展到实际文件列表。