我想在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")
答案 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)