I am programming in python which involves me implementing a shell in Python in Linux. I am trying to run standard unix commands by using os.execvp(). I need to keep asking the user for commands so I have used an infinite while loop. However, the infinite while loop doesn’t work. I have tried searching online but they’re isn’t much available for Python. Any help would be appreciated. Thanks
This is the code I have written so far:
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()
So when I run this and put in the input “ls” I get the output “HelloWorld.py” (which is correct) and “Process finished with exit code 0”. However I don’t get the output “psh>” which is waiting for the next command. No exceptions are thrown when I run this code.
Advertisement
Answer
Your code does not work because it uses os.execvp
. os.execvp
replaces the current process image completely with the executing program, your running process becomes the ls
.
To execute a subprocess use the aptly named subprocess
module.
In case of an ill-advised programming exercise then you need to:
# 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
returns twice, giving the pid of child in parent process, zero in child process.