如何在python脚本内部重新调用它

如何在python脚本内部重新调用它,python,Python,我试图找到在Python脚本内部重新调用Python脚本的最佳方法。目前它的工作方式是。START\u CTX创建于 代码依赖于sys.argv[0]作为“调用者”。但是,如果在以下情况下调用它,则会失败: python script.py ... 这个案例确实有效: python ./script.py ... 因为代码在运行os.execlp之前使用了os.chdir 我确实注意到了os.environ[“”],但我不确定这有多可靠。另一种可能的情况是检查sys.argv[0]是否不在路

我试图找到在Python脚本内部重新调用Python脚本的最佳方法。目前它的工作方式是。
START\u CTX
创建于

代码依赖于
sys.argv[0]
作为“调用者”。但是,如果在以下情况下调用它,则会失败:

python script.py ...
这个案例确实有效:

python ./script.py ...
因为代码在运行
os.execlp
之前使用了
os.chdir

我确实注意到了os.environ[“”],但我不确定这有多可靠。另一种可能的情况是检查
sys.argv[0]
是否不在
路径上且不可执行,并在调用
os.execlp
时使用
sys.executable


有没有关于解决这个问题的更好方法的想法?

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

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

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

  • 在中,我们看到python可执行文件和参数由仲裁器存储到self.START\u CTX中

  • 然后在中,我们看到使用sys.executable、修改的args和os.environ调用execvpe

  • 如果os.environ已在其他地方更改(即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()
    
    当我从命令行执行此代码时,它工作正常:

    guest@desktop:~/Python/Test$ python selfreferential.py 
    /Users/guest/Python/Test
    ['selfreferential.py']
    Created /tmp/started.txt
    
    /Users/guest/Python/Test
    ['selfreferential.py']
    Deleted /tmp/started.txt
    
    guest@desktop:~/Python/Test$ python ./selfreferential.py 
    /Users/guest/Python/Test
    ['./selfreferential.py']
    Created /tmp/started.txt
    
    /Users/guest/Python/Test
    ['./selfreferential.py']
    Deleted /tmp/started.txt
    
    guest@desktop:~/Python/Test$ cd
    guest@desktop:~$ python Python/Test/selfreferential.py 
    /Users/guest
    ['Python/Test/selfreferential.py']
    Created /tmp/started.txt
    
    /Users/guest
    ['Python/Test/selfreferential.py']
    Deleted /tmp/started.txt
    
    guest@desktop:~$ python /Users/guest/Python/Test/selfreferential.py 
    /Users/guest
    ['/Users/guest/Python/Test/selfreferential.py']
    Created /tmp/started.txt
    
    /Users/guest
    ['/Users/guest/Python/Test/selfreferential.py']
    Deleted /tmp/started.txt
    
    guest@desktop:~$ 
    

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

    有许多方法可以调用Gunicorn,这意味着它不能将所有引导序列强制到一个阻塞点。是否可以简单地不允许第一种情况,或者将脚本包装在shell脚本中以纠正它?