为什么会出现OSError:[Errno 7]参数列表过长:b'/ usr / local / bin / git'?

时间:2020-09-26 01:09:18

标签: python python-3.x django git

我正在上一门编程课程(CS50W),它有一条命令可以自动将项目提交到github。它称为submit50。 当尝试通过此方法将代码推送到github时,我这样做:

submit50 --verbose web50/projects/2020/x/capstone

我收到以下错误:

OSError: [Errno 7] Argument list too long: b'/usr/local/bin/git'

我真的不知道这里发生了什么。如果您能帮助我,我将不胜感激。

带追溯的完整错误:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/bin/submit50", line 11, in <module>
    load_entry_point('submit50==3.0.2', 'console_scripts', 'submit50')()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/submit50/__main__.py", line 147, in main
    user_name, commit_hash, message = lib50.push("submit50", args.slug, CONFIG_LOADER, prompt=prompt)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/lib50/_api.py", line 69, in push
    with authenticate(remote["org"], repo=repo) as user, prepare(tool, slug, user, included):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/lib50/_api.py", line 326, in prepare
    _run(git(f"add -f {' '.join(shlex.quote(f) for f in included)}"))
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/lib50/_api.py", line 703, in _run
    with _spawn(command, quiet, timeout) as child:
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/lib50/_api.py", line 674, in _spawn
    child = pexpect.spawn(
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pexpect/pty_spawn.py", line 205, in __init__
    self._spawn(command, args, preexec_fn, dimensions)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pexpect/pty_spawn.py", line 303, in _spawn
    self.ptyproc = self._spawnpty(self.args, env=self.env,
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pexpect/pty_spawn.py", line 315, in _spawnpty
    return ptyprocess.PtyProcess.spawn(args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/ptyprocess/ptyprocess.py", line 330, in spawn
    raise exception
OSError: [Errno 7] Argument list too long: b'/usr/local/bin/git'
Submission cancelled.

1 个答案:

答案 0 :(得分:2)

“参数列表太长”是Unix风格的 1 错误,它表示类似exec的函数的参数太长。 (此处的b'/usr/local/bin/git'部分具有误导性:这不是太长的部分。)前缀/Library/Frameworks/Python.framework/强烈表明您使用的是MacOS,它具有基于Unix的Mach内核。并具有relatively small argument limits

sh-3.2$ sysctl kern.argmax
kern.argmax: 262144

这意味着最多有256 kiB个自变量字符,包括命令本身和所有自变量字节,包括以每个终止的\0字节。 argv本身的长度通常也有限制。细节因一个系统而异。例如,也请参见unix.stackexchange.com网站上的this question

我现在还不清楚该怎么办。查看堆栈跟踪,我们发现这对线(我在这里将其分开以进行发布):

File "/Library/Frameworks/Python.framework/Versions/3.8/
        lib/python3.8/site-packages/lib50/_api.py", line 326, in prepare
  _run(git(f"add -f {' '.join(shlex.quote(f) for f in included)}"))

指向罪魁祸首:prepare库中名为lib50的函数,它是您所提供课程的一部分。这试图通过将许多文件名传递到其git add命令来运行Git命令。它在哪里获得included列表?那,我们不知道。如果此列表短了 ,则不会发生此问题,但是如果您没有办法缩短列表,则知道这将无济于事。

提高kern.argmax会有所帮助,但这可能不是您可以设置的。

使用具有不同(或可提升)最大值的其他操作系统可能会有所帮助。

不过,“正确答案”可能是使软件本身更智能。无需以特定方式调用git add,每个文件都列为一个大argv向量。实际上,除了直接调用git add之外,程序可能还应该调用git update-index。 Python程序可能应该将update-index--stdin-z标志(以及适合此特定函数预期用途的任何其他标志)一起使用。


1 其他系统现在也提供类似Unix的错误号,即使它们不是基于Unix的也是如此。在MacOS上,这个特定的是E2BIG或错误#7。