Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中运行BASH内置命令?_Python_Bash_Command_Subprocess - Fatal编程技术网

在Python中运行BASH内置命令?

在Python中运行BASH内置命令?,python,bash,command,subprocess,Python,Bash,Command,Subprocess,有没有办法从Python运行BASH内置命令 我试过: subprocess.Popen(['bash','history'],shell=True, stdout=PIPE) subprocess.Popen('history', shell=True, executable = "/bin/bash", stdout=subprocess.PIPE) os.system('history') 以及它的许多变体。我想运行history或fc-ln subprocess.Popen(["b

有没有办法从Python运行BASH内置命令

我试过:

subprocess.Popen(['bash','history'],shell=True, stdout=PIPE)

subprocess.Popen('history', shell=True, executable = "/bin/bash", stdout=subprocess.PIPE)

os.system('history')
以及它的许多变体。我想运行
history
fc-ln

subprocess.Popen(["bash", "-c", "type type"])
这将调用bash并告诉bash运行字符串
type
,该字符串在参数
type
上运行内置命令
type

输出:
类型是shell内置的


-c
后面的部分必须是一个字符串。这是行不通的:
[“bash”、“-c”、“type”、“type”]

我终于找到了一个有效的解决方案

from subprocess import Popen, PIPE, STDOUT
shell_command = 'bash -i -c "history -r; history"'
event = Popen(shell_command, shell=True, stdin=PIPE, stdout=PIPE, 
    stderr=STDOUT)

output = event.communicate()

谢谢大家的意见。

我觉得第二个很合适。它出了什么问题?运行bash进程并与之交互怎么样?对于长时间运行的命令或与shell交互(即在
sudo
之后输入密码),它可能更简单、更有用。我认为可能适合这种需要。这适用于“type”和“alias”,但不适用于“history”或“fc-ln”。@duanedesign它们可以工作,但从子进程启动的bash会话禁用了其历史记录。这种行为是故意的。您必须告诉bash以某种方式启用其历史记录。我记得不久前在某个stackexchange网站上读到一个关于这个的问题。当我再次找到它时,我将向您报告。@duane在那里设计的描述建议只获取$HOME/.bash\u历史记录,但这似乎不是最新的。我认为只有当一个shell,或者可能是所有shell?退出时才会保存。您的警告“在
-c
之后的部分必须是一个字符串”非常重要。我第一次错过了它,在我的例子中,
supprocess.run(['bash','-c',command-command-that-shouldnt'],check=True)
正确地失败了,而
supprocess.run(['bash','-c','command',command-that-shouldnt'],check=True)
工作得很好。
shell=True
在这里是多余的(它启动时不需要
/bin/sh
)。您可以删除它并使用中的列表参数。遗憾的是,'-r'选项在打开shell后没有执行任何当前命令。'-r'选项将~/.bash_历史文件中的任何内容加载到您刚刚打开的新shell中。但是,~/.bash_历史文件通常仅在关闭shell时更新(除非你的.bashrc中有一个PROMPT_命令hack)。由于你无法关闭当前正在运行的shell(以更新历史文件),你运气不好。我还没有找到解决方法。