我想要实现的是启动以下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调用的语法,以便我可以提供文件重定向吗?
提前致谢。
答案 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特殊字符。