也许你应该这样做:
os.execl(INTERP, *sys.argv) # don't pass again the interpreter path.
我认为这份文档有误:
http://wiki.dreamhost.com/Passenger_WSGI
关于exec:
Unix类操作系统的exec函数是一组函数,它们会将运行中的进程完全替换为传递给该函数的程序。
os.execl(path, arg0, arg1, ...)
os.execle(path, arg0, arg1, ..., env)
os.execlp(file, arg0, arg1, ...)
os.execlpe(file, arg0, arg1, ..., env)
os.execv(path, args)
os.execve(path, args, env)
os.execvp(file, args)
os.execvpe(file, args, env)
来源:http://docs.python.org/library/os.html
exec*()函数的“l”和“v”变体在传递命令行参数方面有所不同。如果代码编写时参数数量固定,那么“l”变体可能是最容易使用的;单个参数只需成为execl*()函数的附加参数即可。如果参数数量是可变的,并且将参数作为args参数传递到列表或元组中,则“v”变体很好。在任一情况下,子进程的参数应以要运行的命令的名称开头,但这并非强制执行。
编辑:
我刚刚在python shell中做了你正在做的事情,我得到了相同的错误:
>>> import os
>>> import sys
>>> os.execl('/home/login/projects/virtual/bin/python', '/home/login/projects/virtual/bin/python', *sys.argv)
/home/login/projects/virtual/bin/python: can't find '__main__.py' in ''
<login>
的目录吗?你是怎么做到的?那很难做到。 - S.Lott<login>
和<env_name>
使得尝试解决问题变得非常困难。我不知道你认为自己在保护什么“秘密”,但你应该选择没有 shell 特殊字符的名称。 - S.Lott