繁体   English   中英

调用virtualenv捆绑的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引导脚本创建的有效现有文件。 当点的路径长度大于120个字符时(大约),将出现问题。 如果我删除路径中间的一个“ subdir”元素,则一切工作都很好。 此问题的原始来源是jenkins构建由于长工作区名称而导致virtualenv创建失败。

子进程模块中的可执行路径长度是否有任何限制(我在功能文档中找不到)还是实现错误? 有好的解决方法吗?

当我尝试从bash调用venv中的pip时,出现了错误的解释器错误。

问题的真正根源是shebang字符串长度限制( 此处接受的答案的注释声称默认限制等于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'
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM