使用python 2.4的输入重定向运行shell命令?

时间:2010-09-09 19:38:57

标签: python shell io-redirection

我想要实现的是启动以下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 :(得分:11)

您必须自己将文件提供给mysql stdin。这应该做到。

import subprocess
...
filename = ...
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName]
f = open(filename)
subprocess.call(cmd, stdin=f)

答案 1 :(得分:4)

符号<仅在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

答案 2 :(得分:0)

正如Andrey正确注意到的那样,<重定向运算符由shell解释。因此另一种可能的解决方案是:

import os
os.system("mysql -h " + ip + " -u " + mysqlUser + " " + dbName)

它有效,因为os.system将其参数传递给shell。

请注意,我假设所有使用的变量都来自可靠来源,否则您需要验证它们以防止任意代码执行。这些变量也不应包含空格(默认IFS值)或shell特殊字符。