Python subprocess.call bash 别名

2025-03-05 09:18:00
admin
原创
64
摘要:问题描述:我的 .bashrc 中有一个别名,它调用其他脚本,并向其传递特定的命令行参数。我想编写一个 python 脚本,每隔几分钟调用一次这个别名,这样我就可以打开一个带有更新统计数据的 shell。但是subprocess.call("myAlias"),像这样尝试,失败了:from...

问题描述:

我的 .bashrc 中有一个别名,它调用其他脚本,并向其传递特定的命令行参数。

我想编写一个 python 脚本,每隔几分钟调用一次这个别名,这样我就可以打开一个带有更新统计数据的 shell。

但是subprocess.call("myAlias"),像这样尝试,失败了:

from subprocess import call

def callAlias():
    call("myAlias")

callAlias()

我怎样才能让 Python 使用我的别名.bashrc


解决方案 1:

更新:感谢大家对这个解决问题的技巧的点赞,我很高兴它有用。但tripleee 的答案更好


如果您需要的别名是在 ~/.bashrc 中定义的,那么它将不会运行,原因如下:

  1. 您必须给出shell关键字 arg:

subprocess.call('command', shell=True)

否则,您给出的命令将用于查找可执行文件,而不是传递给 shell,并且 shell 会扩展别名和函数等内容。

  1. 默认情况下,subprocess.call和朋友使用/bin/shshell。如果这是您想要调用的 Bash 别名,则需要使用executable关键字 arg 告诉 subprocess 使用 bash 而不是 sh:

subprocess.call('command', shell=True, executable='/bin/bash')
  1. 但是,除非作为“交互式”shell(使用-i.)启动,否则 /bin/bash 将不会获取 ~/.bashrc。不幸的是,您无法传递executable='/bin/bash -i',因为它认为整个值是可执行文件的名称。因此,如果您的别名是在用户的正常交互式启动中定义的,例如在 .bashrc 中,那么您必须使用以下替代形式调用该命令:

subprocess.call(['/bin/bash', '-i', '-c', command])
# i.e. shell=False (the default)

解决方案 2:

您需要将shell关键字设置为 True:

call("myAlias", shell=True)

来自相关文献:

如果shellTrue,则指定的命令将通过 shell 执行。如果您使用 Python 主要是为了获得它在大多数系统 shell 上提供的增强控制流,并且仍想访问其他 shell 功能(如文件名通配符、shell 管道和环境变量扩展),那么这将非常有用。

别名是 shell 的一个特性(例如,它们由 shell 定义和解释)。

但是,shell(/bin/sh)是非交互执行的,因此不会读取.profile任何.bashrc文件,并且您的别名可能不可用。

如果你不愿意在你的 Python 脚本中使用完整的扩展命令,你必须使用$ENV环境变量来让 Shell 读取其中定义的别名的文件:

call("myAlias", shell=True, env=dict(ENV='/path/to/aliasfile'))

解决方案 3:

建议的解决方案是不要使用别名来定义非专门用于交互使用的功能(即使这样,shell 函数在许多方面也更胜一筹)。

将别名重构为独立脚本并像任何其他外部命令一样调用它。

更详细地说,如果你有

alias myalias='for x in foo bar baz; do
    frobnicate "$x"; done'

你可以改进它,这样它就不会通过把它变成一个函数来污染你的全局命名空间

myalias () {
    local x
    for x in foo bar baz; do
        frobnicate "$x"
    done
}

或者仅将其另存为 /usr/local/bin/myaliaschmod a+x /usr/local/bin/myalias使其可供所有人执行;

#!/bin/sh
for x in foo bar baz; do
    frobnicate "$x"
done

(这在子进程中运行,因此x当脚本完成时它就会消失;所以我们不需要这样做local。)

(当然,如果frobnicate写得足够好,也许你可以简化得frobnicate foo bar baz同样好。)

这是一个常见的常见问题解答。

解决方案 4:

我稍微修改了 Jonathan 的理由 #2,让它工作起来。创建一个/usr/local/bin/interactive_bash包含以下内容的文件

#!/bin/bash
/bin/bash -i "$@"

然后chmod +x你可以从 Python 调用

subprocess.call('my_alias', shell=True, executable='/usr/local/bin/interactive_bash')
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用