我在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和#34;结束。但是我没有得到输出" psh>"等待下一个命令。运行此代码时不会抛出任何异常。
答案 0 :(得分:4)
您的代码无效,因为它使用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
返回两次,在父进程中给出child的pid,在子进程中为0。
答案 1 :(得分:1)
如果您希望它像shell一样运行,那么您正在寻找os.fork()。在调用os.execvp()之前调用它,它将创建一个子进程。 os.fork()返回进程ID。如果它为0,那么您在子进程中并且可以调用os.execvp(),否则继续执行代码。这将使while循环继续运行。您可以让原始进程等待它完成os.wait(),或者继续而不等待while循环的开始。此链接第2页上的伪代码应该有助于https://www.cs.auckland.ac.nz/courses/compsci340s2c/assignments/A1/A1.pdf