2015-11-27 2 views
0

Я хотел бы выполнить определенную версию mysqld через Python для модульного тестирования. Идея состоит в том, чтобы выполнить сервер по потоку, протестировать и убить сервер, когда это будет сделано. (Аналогично testing.mysqld, который, к сожалению, не работает на Windows.). Это текущий код:Запуск временного сервера MySQL с Python

#Create a temporary folder. 
    base_path = tempfile.mkdtemp() 

    #Extract the default files 
    zipfile.ZipFile(r"O:\Tools\mysql\min_mysql.zip").extractall(base_path) 

    #Setup my_ini file 
    my_ini_path = os.path.join(base_path, "my.ini").replace("\\", "/") 
    unix_base_path = posixpath.normpath(base_path).replace("\\", "/") 

    with open(my_ini_path, 'r') as my_ini: 
     filedata = my_ini.read() 
    filedata = filedata.replace("{{basedir}}", unix_base_path) 
    with open(my_ini_path, 'w', 0) as my_ini: 
     my_ini.write(filedata) 

    #Open mysqld 
    args = r"O:/Tools/mysql/bin/mysqld.exe --defaults-file=\"%s\"" % (my_ini_path) 
    args = shlex.split(args) 
    mysqld_process = subprocess.Popen(args, shell=True) 
    mysqld_process.wait() 

Но если я исполню ее с помощью Python, я получаю эту ошибку:

Could not open required defaults file: 
    "c:\users\pelfeli1\appdata\local\temp\tmp2vct38\my.ini" 
    Fatal error in defaults handling. Program aborted 

До сих пор я проверить, что файл существует до начала процесса. Если я напечатаю команду дословно и ее выполним, сервер будет работать нормально.

Кажется, что разница между Popen и просто выполнением в оболочке. Что мне не хватает?

+0

Я не думаю, что это проблема, но строка 'args' не должна быть определена как raw (с' r'). Вместо этого сделайте следующее: '' O: /Tools/mysql/bin/mysqld.exe --defaults-file = "% s" ''(т. Е. Использовать одинарные кавычки). Если вы не собираетесь передавать обратную косую черту в командную строку –

+0

Ну, это странно. Я вообще удалил «r» и котировки. Это сработало. Сервер запускается. Я понятия не имею, почему, поскольку он все еще работает с котировками на CMD. Я ненавижу это чувство. –

ответ

0

Я скопирую свой комментарий здесь, если вы хотите, чтобы принять его в качестве ответа:

I don't think this is the problem, but the args string shouldn't be defined as raw (with the r). Instead, do this: 'O:/Tools/mysql/bin/mysqld.exe --defaults-file="%s"' (ie. use single quotes). Unless you intend to pass the backslashes to the command line

Теперь, примите во внимание, что следующие две строки

"foo\"bar\"" 
r"foo\"bar\"" 

ли не тоже самое. Первый показывает foo"bar", а второй дает вам foo\"bar\".

Итак, что происходит в том, что оболочка видит это как имя файла: "c:\users\pelfeli1\appdata\local\temp\tmp2vct38\my.ini", включая цитаты, из-за обратные кавычки (\). Вы могли бы просто написал это:

args = 'O:/Tools/mysql/bin/mysqld.exe --defaults-file="%s"' % (my_ini_path) 

только в случае пространств в my_ini_path, без проблем.

0

Ну, проблема была в кавычках. Просто изменил эту строку:

args = r"O:/Tools/mysql/bin/mysqld.exe --defaults-file=\"%s\"" % (my_ini_path) 

этой линии

args = "O:/Tools/mysql/bin/mysqld.exe --defaults-file=%s" % (my_ini_path) 

Я до сих пор понятия не имею, почему это меняет что-либо, потому что печать арг дает правильный (и работает) команду в обоих случаях.

Смежные вопросы