python - 不使用 os.execvp 时无限

标签 python python-3.x linux shell

我正在用 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/

相关文章:

c - Linux 终端文件打开

node.js - 错误 : Node Sass does not yet support your current environment: Linux 64-bit with Unsupported runtime (64)

python - 使用cmd将文件从windows传输到linux服务器

Python sqlite3 - 按星期几列对表进行排序

python - 如何让子线程处理Python中的主进程被杀死或关键中断?

python - 如何在 Tensorflow 2.0 中应用 Guided BackProp?

python - 库在 Spyder 中工作正常,但在 PyCharm 中不行

python - 使用 PKCS#11 在 Python 中提供 SSL 连接

python - 目标为列表时的 Pygame 设置音量

python - 使用 Pandas 写入特定范围/列