我几乎是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
我做错了什么或者有其他方法可以永久存储程序的路径吗?
答案 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
,因此source
和shopt
也会失败。
如果 使用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中,将别名设置为相反的值非常麻烦。