我可以使用别名从python脚本执行程序

时间:2011-07-28 08:34:09

标签: python bash unix alias nuke

我几乎是python脚本的新手,所以请原谅任何愚蠢的问题,但任何人都可以给予的帮助将非常感激。

我正在尝试编写一个python脚本供其他人使用,在其中我需要调用一个我不会总是知道路径的程序。为了解决这个问题,我要求用户提供程序的路径,这将有效,但我不希望用户每次运行脚本时都必须提供路径,所以我一直在尝试设置bash通过将脚本添加到〜/ .profile和〜/ .bashrc文件来实现别名。

然后我可以使用别名从交互式bash shell运行程序,但是当脚本尝试运行它时,我收到“找不到命令”错误...

我尝试重新获取.bashrc文件并使用“shopt -s expand_aliases”命令而没有运气。

我的〜/ .bashrc看起来像这样:

alias nuke='/Applications/Nuke6.2v4/Nuke6.2v4.app/Contents/MacOS/Nuke6.2v4'

脚本的一部分看起来像这样:

os.system('source .bashrc')
os.system('shopt -s expand_aliases')
os.system('nuke -x scriptPath')

但是一旦脚本到达这一点,它就会返回:

sh: nuke: command not found

我做错了什么或者有其他方法可以永久存储程序的路径吗?

5 个答案:

答案 0 :(得分:15)

您想要的模块是subprocess

快速解决您的问题是使用子进程模块,如下所示:

import subprocess
sp = subprocess.Popen(["/bin/bash", "-i", "-c", "nuke -x scriptpath"])
sp.communicate()

这相当于调用:

nuke -x scriptpath
来自bash shell的

。 -i标志告诉bash表现得像是一个交互式会话(并使用〜/ .bashrc文件)

但是,您应该非常小心,不要打开任何shell注入(例如,如果从CGI页面调用此命令)

对于用户直接从shell调用的快速scipts,他们可能不会比通常的shell访问造成更多的损害,但如果这个脚本被网页调用,恶意用户可能会传递一些类似“ rm -dfr~ /&“作为程序。*

如果可执行文件的数量很少,那么在脚本中命名它们可能会更好:

PROGRAMS = {"nuke": "/path/to/nuke"
                "foo" : "/path/to/foo" }

# Parse command line args
program = sys.argv[1] 

sp = subprocess.Popen([PROGRAMS[program], "other", "arguments", "to", "program"])

*这可能不会完全像这样,但你明白了

答案 1 :(得分:2)

请注意,os.system可能正在使用sh而不是bash,因此sourceshopt也会失败。

如果 使用bash,则会失败,因为os.system会为每次调用创建一个新进程。你可以在一行中这样做:

os.system('source .bashrc; shopt -s expand_aliases; nuke -x scriptPath')

最好以其他方式获取路径(如果需要,甚至可以手动从.bashrc读取),然后使用subprocess.Popen()。< / p>

答案 2 :(得分:2)

我知道这是一个老问题,但对于将来遇到此问题的其他人,我认为值得一提的是修改某人的〜/ .bashrc或〜/ .profile文件(特别是默默地)这些想法通常属于&#34;不良做法&#34;的范畴。此外,对于您需要解决的问题,似乎有点苛刻。

相反,为什么不让您的脚本跟踪存储在用户主目录中的自己的配置文件?使用ConfigParser,将您自己的JSON结构转储到文件中,或者如果您想要的话,完全不需要其他内容,这样做非常简单。

然后在您的脚本中,您可以先检查它是否存在,如果存在,请查看它是否包含您要查找的包含可执行路径的密钥。如果其中任何一个测试失败,您就知道需要提示用户输入路径,此时您可以将其写入配置文件以供下次使用。

答案 3 :(得分:0)

是的,不要那样做。将您的配置写入您自己的dotfile,不要使用os.system,请使用subprocess

答案 4 :(得分:-1)

我认为别名是使用shell环境的一种非常复杂且不太直观的方式。如何使用环境变量呢?这基本上就是他们的目的......

不要让用户定义别名nuke,而是要求他们定义环境变量$NUKE。这样可以避免弄乱.bashrc或任何其他配置文件。如果用户将export NUKE=<path>添加到.bashrc,则在以交互方式执行python脚本时,它将自动在环境中可用。

如果您只需要此路径进行系统调用,只需使用os.system('$NUKE -x scriptPath')

如果您需要python中的值,也很容易访问:在import os之后,os.environ会为您提供当前定义的所有环境变量的字典。在python中,将别名设置为相反的值非常麻烦。