python os.execvp () при попытке отобразить таблицы mysql выдает ошибку 1049 - неизвестная ошибка базы данных - PullRequest
0 голосов
/ 16 апреля 2010

У меня есть вопрос, связанный с MySQL и Python.

Эта команда работает на оболочке, но не при использовании os.execvp.

$./mysql -D test -e "show tables"

+----------------+
| Tables_in_test |
+----------------+
| sample         |
+----------------+

Соответствующий кусок кода на Python будет

def execute():
    args = []
    args.extend(sys.argv[1:])
    args.extend([MYSQL, '-D test -e "show tables"'])
    print args
    os.execvp(args[0], args)
    child_pid = os.fork()
    if child_pid == 0:
        os.execvp(args[0], args)
    else:
        os.wait()

Вывод этого:

[./mysql', '-D test -e "show tables"']
ERROR 1049 (42000): Unknown database ' test -e "show tables"'

Я не уверен, является ли это проблемой с синтаксисом Python или нет. Кроме того, та же команда работает с вызовом os.system.

os.system(MYSQL + ' -D test -e "show tables"')

Пожалуйста, дайте мне знать, как заставить это работать.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2010

Попробуйте:

args.extend([MYSQL, '-D', 'test', '-e', 'show tables'])

Вам также может быть интересен модуль subprocess, если вы не знали об этом:

>>> import subprocess as subp
>>> print subp.Popen(["mysql", '-D', 'mysql', '-e', 'show tables'], stdout=subp.PIPE).communicate()[0]
Tables_in_mysql
columns_priv
db
func
help_category
help_keyword
help_relation
...

Или просто subp.call([MYSQL, ...]), и вам не нужно форк + exec самостоятельно, статус выхода - это возвращаемое значение IIRC.

0 голосов
/ 16 апреля 2010

Каждый из ваших отдельных параметров должен быть отдельным элементом в списке параметров.

args.extend([MYSQL, '-D test', '-e "show tables"'])
...