如何在python脚本内部重新调用它
我试图找到在Python脚本内部重新调用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]是否不在路
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脚本中以纠正它?