如何在python程序中使用shell脚本?

时间:2018-10-10 08:29:02

标签: python csh os.system

我想在python程序中使用C-shell脚本,该程序可用于两个参数。

os.system("recall 20170121 ../E725.txt xy 1")

但是我想将其用于堆栈,因此像下面这样声明变量,但是当我在脚本中调用它们时出现错误,表明输入文件不存在。如何调用变量?

date_ID=(filename[17:25])
fullpath = '../%s' % (filename)
os.system("import_S1_TOPS_modified $date_ID $fullpath vv 1")

1 个答案:

答案 0 :(得分:1)

Shell不了解Python变量,因为它是一个完全不同的系统。因此,您不能使用外壳程序的变量替换机制($date_ID)。相反,您必须将它们作为Python字符串传递:

os.system("import_S1_TOPS_modified %s %s vv 1" % (date_ID, fullpath))

请注意,此代码有一个严重的问题:如果有人将; rm -rf /;设为filename,该怎么办?该命令现在将如下所示:

import_S1_TOPS_modified 20181021; rm -rf /; vv 1

这将删除所有内容。

这就是为什么最好使用subprocess的原因,它根本不使用外壳程序,并且不易受此类问题的影响:

subprocess.call(['import_S1_TOPS_modified', date_ID, fullpath, 'vv', '1'])

如果必须使用外壳,请使用shlex.quote()并添加shell=True

subprocess.call("import_S1_TOPS_modified %s %s vv 1" % (
    shlex.quote(date_ID), shlex.quote(fullpath)),
    shell=True)