python子进程Popen在本地和远程系统上的行为不同

python子进程Popen在本地和远程系统上的行为不同,python,django,travis-ci,Python,Django,Travis Ci,我正在使用django并向travis ci发送一个构建,该构建在我的测试中失败。有问题的一行在这个函数中 from subprocess import Popen, PIPE def make_mp3(path, blob): process = Popen( ['lame', '-', '--comp', '40', path], stdin=PIPE, stdout=PIPE, stderr=PIPE) stdout_data = process.comm

我正在使用django并向travis ci发送一个构建,该构建在我的测试中失败。有问题的一行在这个函数中

from subprocess import Popen, PIPE

def make_mp3(path, blob):
    process = Popen(
        ['lame', '-', '--comp', '40', path], stdin=PIPE, stdout=PIPE, stderr=PIPE)
    stdout_data = process.communicate(input=blob.read())
    return stdout_data
调用函数的行如下所示:

make_mp3(mp3_path, request.FILES['audio_file'])
在我的本地系统上,测试运行良好并通过。我已经使用这个函数一段时间了,它的行为总是和预期的一样。但当我把它发给travis ci进行构建时,它给了我这个回溯

======================================================================
ERROR: test_post_upload_audio_word (define.tests.ViewTests)
Testing the audio upload function for word audio
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/travis/build/deltaskelta/langalang/define/tests.py", line 827, in test_post_upload_audio_word
    'audio_file': audio_file})
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/test/client.py", line 541, in post
    secure=secure, **extra)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/test/client.py", line 343, in post
    secure=secure, **extra)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/test/client.py", line 409, in generic
    return self.request(**r)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/test/client.py", line 494, in request
    six.reraise(*exc_info)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/utils/decorators.py", line 67, in _wrapper
    return bound_func(*args, **kwargs)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/utils/decorators.py", line 63, in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/utils/decorators.py", line 67, in _wrapper
    return bound_func(*args, **kwargs)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/utils/decorators.py", line 63, in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
  File "/home/travis/build/deltaskelta/langalang/define/views.py", line 21, in dispatch
    return super(Define, self).dispatch(*args, **kwargs)
  File "/home/travis/virtualenv/python2.7.12/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/travis/build/deltaskelta/langalang/define/views.py", line 89, in post
    return upload_audio(request, context)
  File "/home/travis/build/deltaskelta/langalang/define/views_func.py", line 251, in upload_audio
    make_mp3(mp3_path, request.FILES['audio_file'])
  File "/home/travis/build/deltaskelta/langalang/define/views_func.py", line 25, in make_mp3
    ['lame', '-', '--comp', '40', path], stdin=PIPE, stdout=PIPE, stderr=PIPE)
  File "/opt/python/2.7.12/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/opt/python/2.7.12/lib/python2.7/subprocess.py", line 1343, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

我不明白为什么这会在我的系统上通过测试而在构建上失败。输入文件显然在那里,因为
request.FILES
找到了它。目录存在..我检查过了。那它告诉我什么是不存在的

失败原因:执行命令无法执行不存在的文件。在您的示例中,它是
lame
。引自:

引发的最常见异常是OSError。例如,当试图执行一个不存在的文件时,就会发生这种情况。应用程序应为操作错误异常做好准备


您还可以在靠近末尾的
subprocess.py
中检查
\u execute\u child
方法的源代码。

如果在生产中手动执行该方法(如果可以),会怎么样?问题是,这个异常不能引用path参数,而可以引用命令you executey,正如我所理解的,您已经发布了这个权限。我忘了在构建环境中安装lame。你怎么知道这也可能是个问题?我花了好几个小时,一遍又一遍地重复同一行,检查路径,因为我认为这就是它告诉我的,我试图在回答中解释它。