【问题标题】:Python3 Run Alias Bash CommandsPython3 运行 Alias Bash 命令
【发布时间】:2016-03-09 19:37:27
【问题描述】:

我有以下代码可以很好地运行 ls 命令。我有一个 bash 别名,我使用 alias ll='ls -alFGh' 是否可以让 python 运行 bash 命令,而无需 python 加载我的 bash_alias 文件、解析,然后实际运行完整的命令?

import subprocess

command = "ls"  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)

#Launch the shell command:
output = process.communicate()

print (output[0])

尝试使用 command = "ll" 我得到的输出是:

/bin/sh: ll: command not found
b''

【问题讨论】:

  • 我不想让人讨厌,但是你为什么要使用子进程来列出文件呢? import osos.listdir()不会达到你想要的吗?
  • 请注意 alias' 是 shell 的东西,而不是 bash 的东西,所以,你的系统不知道别名。您可以通过 shell 执行命令,但这仍然会导致您的别名文件被解析(当 shell 加载时它会解析它)
  • 我的实际命令是将命令传送到 docker 容器中,这只是解决问题的一个示例
  • 另外,这并不能回答你的问题,但你当然可以改用subprocess.Popen(['ls', '-alFGh'], stdout=subprocess.PIPE, stderr=None) (尤其是考虑到shell=True 通常不受欢迎)。

标签: python bash shell


【解决方案1】:

你不能。当您运行 python 进程时,它不知道 shell 别名。有一些简单的方法可以将文本从父进程(IPC 除外)、命令行和通过环境(即导出的)变量传递给子进程。 Bash 不支持导出别名。

来自man bash 页面:对于几乎所有用途,别名都被 shell 函数所取代。

Bash 是否支持导出函数,所以我建议你将别名设置为一个简单的函数。这样它就从shell导出到python再到shell。例如:

在外壳中:

ll() { ls -l; }
export -f ll

在python中:

import subprocess

command = "ll"  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)

output = process.communicate()

print(output[0].decode())    # Required if using Python 3

由于您使用的是print() 函数,我假设您使用的是python 3。在这种情况下,您需要.decode(),因为返回的是一个字节对象。

通过一些hackery,也可以从python创建和导出shell函数。

【讨论】:

  • 谢谢!这非常有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 2013-08-11
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多