如何在其

2024-10-04 05:33:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到在Python脚本内部重新调用的最佳方法。目前它的工作方式是http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L285START_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。在

有什么更好的方法来解决这个问题吗?在


Tags: 方法代码pygithubmastercomhttpos
2条回答

我建议另一种方法。将所有脚本功能打包成一个函数,在脚本执行时调用该函数,该函数可以递归地调用自身,而不是执行新的进程。在

我认为这里真正的问题是/仲裁者.py代码希望每次在完全相同的环境下执行Python脚本。这一点很重要,因为被调用的Python脚本是未知的,而且每次都要以相同的方式调用它。在

我的感觉是,您遇到的问题与仲裁者调用Python脚本之间的环境变化有关。在

  1. http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L85-89中,我们看到python可执行文件和参数被仲裁器存储到自行启动.

  2. 然后在http://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L303-305中,我们看到execvpe是用系统可执行文件,修改后的参数,然后操作系统环境.

如果操作系统环境如果更改了其他位置(即PWD变量),则无法正确调用可执行文件(因为您已不在正确的文件夹中)。仲裁者似乎通过将cwd存储在START CTX中来处理这种可能性。所以问题仍然存在,为什么调用对你来说失败了?在

我尝试了一些测试代码,我写了如下:

#!/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()

当我从命令行执行此代码时,它可以正常工作:

^{pr2}$

正如你所看到的,做古尼康所做的没有问题。所以,也许你的问题和环境变量有关。或者可能与您的操作系统执行操作的方式有关。在

相关问题 更多 >