【问题标题】:Starting a temporary MySQL server with Python使用 Python 启动临时 MySQL 服务器
【发布时间】:2015-11-27 20:55:48
【问题描述】:

我想通过 Python 执行特定版本的 mysqld 进行单元测试。这个想法是在线程上执行服务器,测试并在完成后终止服务器。 (类似于testing.mysqld,遗憾的是它不适用于 Windows。)。这是当前代码:

    #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 和仅在 shell 中执行之间似乎存在差异。我错过了什么?

【问题讨论】:

  • 我不认为这是问题所在,但不应将args 字符串定义为原始字符串(使用r)。相反,这样做:'O:/Tools/mysql/bin/mysqld.exe --defaults-file="%s"'(即使用单引号)。除非您打算将反斜杠传递给命令行
  • 嗯,这很奇怪。我完全删除了r 和引号。有效。服务器启动。我不知道为什么,因为它仍然适用于 CMD 上的引号。伙计,我讨厌那种感觉。

标签: python mysql python-2.7 mysql-python


【解决方案1】:

如果您想接受它作为答案,我将在此处复制我的评论:

我不认为这是问题所在,但 args 字符串不应该是 定义为原始(使用 r)。相反,请执行以下操作: 'O:/Tools/mysql/bin/mysqld.exe --defaults-file="%s"'(即使用单 引号)。除非您打算将反斜杠传递给命令行

现在,考虑以下两个字符串

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

是一样的。第一个呈现foo"bar",而第二个呈现foo\"bar\"

所以,发生的事情是 shell 将此视为文件名:"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中有空格的情况下,没有问题。

【讨论】:

    【解决方案2】:

    嗯,问题出在引号里。刚刚更改了这一行:

        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)
    

    我仍然不知道为什么这会改变任何东西,因为打印 args 在这两种情况下都会给出有效(且有效)的命令。

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2022-11-18
      • 2021-07-21
      相关资源
      最近更新 更多