<p>我认为这里真正的问题是/仲裁者.py代码希望每次在完全相同的环境下执行Python脚本。这一点很重要,因为被调用的Python脚本是未知的,而且每次都要以相同的方式调用它。在</p>
<p>我的感觉是,您遇到的问题与仲裁者调用Python脚本之间的环境变化有关。在</p>
<ol>
<li><p>在<a href="http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L85-89" rel="nofollow noreferrer">http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L85-89</a>中,我们看到python可执行文件和参数被仲裁器存储到自行启动. </p></li>
<li><p>然后在<a href="http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L303-305" rel="nofollow noreferrer">http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L303-305</a>中,我们看到execvpe是用系统可执行文件,修改后的参数,然后操作系统环境. </p></li>
</ol>
<p>如果操作系统环境如果更改了其他位置(即PWD变量),则无法正确调用可执行文件(因为您已不在正确的文件夹中)。仲裁者似乎通过将cwd存储在START CTX中来处理这种可能性。所以问题仍然存在,为什么调用对你来说失败了?在</p>
<p>我尝试了一些测试代码,我写了如下:</p>
<pre><code>#!/usr/bin/env python
import sys
import os
def main():
"""Execute twice"""
cwd = os.getcwd()
print cwd
print sys.argv
if os.path.exists("/tmp/started.txt"):
os.unlink("/tmp/started.txt")
print "Deleted /tmp/started.txt"
print
return
args = [sys.executable] + sys.argv[:]
os.system("touch /tmp/started.txt")
print "Created /tmp/started.txt"
print
os.execvpe(sys.executable, args, os.environ)
if __name__ == '__main__':
main()
</code></pre>
<p>当我从命令行执行此代码时,它可以正常工作:</p>
^{pr2}$
<p>正如你所看到的,做古尼康所做的没有问题。所以,也许你的问题和环境变量有关。或者可能与您的操作系统执行操作的方式有关。在</p>