Запустить команду оболочки с перенаправлением ввода из Python 2.4? - PullRequest
11 голосов
/ 09 сентября 2010

Чего я хотел бы добиться, так это запустить следующую команду оболочки:

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)

нет идти туда эфир

Может ли кто-нибудь указать синтаксис для вызова оболочки, чтобы я мог передать перенаправление файлов?

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 09 сентября 2010

Вы должны передать файл в mysql stdin самостоятельно.Это должно сделать это.

import subprocess
...
filename = ...
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName]
f = open(filename)
subprocess.call(cmd, stdin=f)
4 голосов
/ 09 сентября 2010

Символ < имеет это значение (то есть читает файл в stdin) только в оболочке.В Python вы должны использовать одно из следующих:

1) Считать содержимое файла в вашем процессе и передать его на stdin дочернего процесса:

fd = open(filename,  'rb')
try:
    subprocess.call(cmd, stdin=fd)
finally:
    fd.close()

2) Считать содержимое файлачерез оболочку (как вы упомянули), но перенаправьте stdin вашего процесса соответственно:

# In file myprocess.py
subprocess.call(cmd, stdin=subprocess.PIPE)

# In shell command line
$ python myprocess.py < filename
0 голосов
/ 10 сентября 2010

Как правильно заметил Андрей, оператор перенаправления < интерпретируется оболочкой.Отсюда и другое возможное решение:

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

Это работает, потому что os.system передает свой аргумент в оболочку.

Обратите внимание, что я предположил, что все используемые переменные происходят из доверенного источника, иначе вам нужнопроверить их, чтобы предотвратить выполнение произвольного кода.Также эти переменные не должны содержать пробелов (значение по умолчанию IFS) или специальных символов оболочки.

...