如何在 Python 2.4 中运行带输入重定向的 shell 命令?
我想要实现的是在下面这个命令行中启动一个shell命令:
mysql -h hostAddress -u userName -p userPassword
databaseName < fileName
这个命令是在一个Python 2.4的脚本中运行的,写法大概是这样的:
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName, "<", file]
subprocess.call(cmd)
但是这个方法出错了,我觉得是因为使用了重定向符号,导致mysql没有接收到输入文件。
我也试过其他的方法:
subprocess.call(cmd, stdin=subprocess.PIPE)
但是也不行。
有没有人能告诉我正确的语法,怎么在shell调用中使用文件重定向?
提前谢谢大家。
3 个回答
0
正如安德烈正确指出的,<
重定向操作符是由命令行解释的。因此,还有另一种可能的解决方案:
import os
os.system("mysql -h " + ip + " -u " + mysqlUser + " " + dbName)
之所以能工作,是因为 os.system
会把它的参数传递给命令行。
需要注意的是,我假设所有使用的变量都是来自可信的来源,否则你需要对它们进行验证,以防止任意代码执行。此外,这些变量不应该包含空格(默认的 IFS
值)或命令行特殊字符。
5
符号 <
只有在 shell 中才有这个意思(也就是把文件内容读入 stdin
)。在 Python 中,你应该使用以下两种方法之一:
1) 在你的程序中读取文件内容,然后把它传给子进程的 stdin
:
fd = open(filename, 'rb')
try:
subprocess.call(cmd, stdin=fd)
finally:
fd.close()
2) 通过 shell 读取文件内容(就像你提到的那样),但要相应地重定向你程序的 stdin
:
# In file myprocess.py
subprocess.call(cmd, stdin=subprocess.PIPE)
# In shell command line
$ python myprocess.py < filename
11
你需要自己把文件输入到mysql的标准输入中。这样做就可以了。
import subprocess
...
filename = ...
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName]
f = open(filename)
subprocess.call(cmd, stdin=f)