调用 virtualenv bundled pip wuth subprocess.call 在 Linux 上的 venv 目录的长路径上失败

calling virtualenv bundled pip wuth subprocess.call fails on long path to venv directory on Linux

以下行在 Linux 中抛出奇怪的异常(几个 Ubuntu 14.04 安装和一个安装了所有更新的 Arch linux 安装):

subprocess.call(['/home/vestnik/Development/test/python/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/venv/bin/pip','install','httpbin'])

python2.7:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 523, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

python3.5:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/subprocess.py", line 557, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib/python3.5/subprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '/home/vestnik/Development/test/python/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/venv/bin/pip'

我正在尝试的 pip 可执行文件 运行 是由 virtualenv bootstrap 脚本创建的有效现有文件。当 pip 的路径长度变得大于 120 个字符(大约)时,就会出现问题。如果我删除路径中间的一个 "subdir" 元素,一切都很好。此问题的原始来源是由于工作空间名称过长,jenkins 构建在创建 virtualenv 时失败。

子进程模块中的可执行路径长度是否有任何限制(我没有在函数文档中找到它)或者它是一个实现错误?有什么好的方法可以解决它吗?

当我试图从 bash 调用 venv 中的 pip 时,我遇到了错误的解释器错误。

问题的真正根源是 shebang 字符串长度限制(已接受答案的评论 here 声称默认限制等于 127 字节):

$ head -n1 /home/vestnik/Development/test/python/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/venv/bin/pip 
#!/home/vestnik/Development/test/python/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/venv/bin/python3.5
$ head -n1 /home/vestnik/Development/test/python/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/subdir/venv/bin/pip | wc -c
129

问题源不是子进程模块。它只会产生令人困惑的错误。

以下代码有效:

subprocess.call([
    '/home/...lonl long venv path.../venv/bin/python3.5',
    '/home/...lonl long venv path.../venv/bin/pip',
    'install',
    'httpbin'
])