无限循环在os.execvp中不起作用
我正在用Python编程,主要是在Linux上实现一个命令行工具。我想通过使用os.execvp()来运行标准的Unix命令。为了不断询问用户输入命令,我用了一个无限循环。但是,这个无限循环似乎不太管用。我在网上查了查,发现关于Python的资料不多。希望能得到一些帮助,谢谢!
这是我到目前为止写的代码:
import os
import shlex
def word_list(line):
"""Break the line into shell words."""
lexer = shlex.shlex(line, posix=True)
lexer.whitespace_split = False
lexer.wordchars += '#$+-,./?@^='
args = list(lexer)
return args
def main():
while(True):
line = input('psh>')
split_line = word_list(line)
if len(split_line) == 1:
print(os.execvp(split_line[0],[" "]))
else:
print(os.execvp(split_line[0],split_line))
if __name__ == "__main__":
main()
当我运行这段代码并输入“ls”时,我得到了输出“HelloWorld.py”(这是正确的),还有“Process finished with exit code 0”。但是我没有看到“psh>”这个提示符,它应该在等待下一个命令。运行这段代码时没有抛出任何异常。
2 个回答
如果你想让程序像一个命令行那样运行,你需要使用 os.fork()。在调用 os.execvp() 之前先调用 os.fork(),这样就会创建一个子进程。os.fork() 会返回一个进程 ID。如果返回的是 0,那说明你现在在子进程里,可以调用 os.execvp();如果不是 0,那就继续执行后面的代码。这样可以让 while 循环一直运行。你可以让原来的进程等着子进程完成(用 os.wait()),或者不等直接回到 while 循环的开始。这个链接的第二页上的伪代码应该能帮到你 https://www.cs.auckland.ac.nz/courses/compsci340s2c/assignments/A1/A1.pdf
你的代码不工作是因为它使用了 os.execvp
。这个 os.execvp
会把当前的程序完全替换成你要执行的程序,也就是说,你正在运行的程序 变成了ls。
如果你想执行一个子进程,可以使用一个叫做 subprocess
的模块,这个名字就很贴切。
如果你在做一个不太明智的编程练习,那么你需要:
# warning, never do this at home!
pid = os.fork()
if not pid:
os.execvp(cmdline) # in child
else:
os.wait(pid) # in parent
os.fork
会返回两次,在父进程中返回子进程的ID,在子进程中返回零。