从Python2.4运行带有输入重定向的shell命令?

2024-09-29 02:23:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想实现的是启动以下shell命令:

mysql -h hostAddress -u userName -p userPassword 
databaseName < fileName

在Python2.4脚本中使用类似的东西:

cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName, "<", file]
subprocess.call(cmd)

这是因为使用了重定向符号(我相信)-mysql没有接收到输入文件。

我也试过:

subprocess.call(cmd, stdin=subprocess.PIPE)

不去那里以太

有人能指定进行shell调用的语法,以便我可以输入文件重定向吗?

提前谢谢。


Tags: 文件name命令脚本cmdmysqlusernameshell
3条回答

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

安德烈正确地注意到,<重定向操作符由shell解释。因此,另一个可能的解决方案是:

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

它之所以工作是因为os.system将其参数传递给shell。

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

你必须自己将文件输入mysql stdin。这样就可以了。

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

相关问题 更多 >