我正在用 Python 编程,这涉及到我在 Linux 中用 Python 实现一个 shell。我正在尝试使用 os.execvp() 运行标准的 unix 命令。我需要不断向用户询问命令,所以我使用了无限循环。但是,无限 while 循环不起作用。我试过在线搜索,但它们对 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”(正确)和“进程完成,退出代码为 0”。但是我没有得到正在等待下一个命令的输出“psh>”。当我运行这段代码时没有抛出异常。
最佳答案
您的代码不起作用,因为它使用了 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
返回两次,在父进程中给出子进程的 pid,在子进程中为零。
关于python - 不使用 os.execvp 时无限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25113767/