我试图找到在Python脚本内部重新调用的最佳方法。目前它的工作方式是http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L285。START_CTX
创建于http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L82-86。在
代码依赖于sys.argv[0]
作为“调用者”。但是,在使用以下命令调用时,此操作将失败:
python script.py ...
这个案子确实有效:
^{pr2}$因为代码在运行os.execlp
之前使用了os.chdir
。在
我确实注意到了os.environ["_"]
,但我不确定这有多可靠。另一种可能的情况是检查sys.argv[0]
是否不在PATH
上,并且在调用os.execlp
时使用sys.executable
。在
有什么更好的方法来解决这个问题吗?在
我建议另一种方法。将所有脚本功能打包成一个函数,在脚本执行时调用该函数,该函数可以递归地调用自身,而不是执行新的进程。在
我认为这里真正的问题是/仲裁者.py代码希望每次在完全相同的环境下执行Python脚本。这一点很重要,因为被调用的Python脚本是未知的,而且每次都要以相同的方式调用它。在
我的感觉是,您遇到的问题与仲裁者调用Python脚本之间的环境变化有关。在
在http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L85-89中,我们看到python可执行文件和参数被仲裁器存储到自行启动.
然后在http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L303-305中,我们看到execvpe是用系统可执行文件,修改后的参数,然后操作系统环境.
如果操作系统环境如果更改了其他位置(即PWD变量),则无法正确调用可执行文件(因为您已不在正确的文件夹中)。仲裁者似乎通过将cwd存储在START CTX中来处理这种可能性。所以问题仍然存在,为什么调用对你来说失败了?在
我尝试了一些测试代码,我写了如下:
当我从命令行执行此代码时,它可以正常工作:
^{pr2}$正如你所看到的,做古尼康所做的没有问题。所以,也许你的问题和环境变量有关。或者可能与您的操作系统执行操作的方式有关。在
相关问题 更多 >
编程相关推荐