无限循环在os.execvp中不起作用

0 投票
2 回答
863 浏览
提问于 2025-04-18 15:53

我正在用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 个回答

1

如果你想让程序像一个命令行那样运行,你需要使用 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

5

你的代码不工作是因为它使用了 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,在子进程中返回零。

撰写回答