Connecting Python to MySQL using an encrypted option file
<p>I used <code>mysql_config_editor</code> to create a <code>.mylogin.cnf</code> file with a password. I know it worked correctly because I can use it to connect through both the command line utility <code>mysql</code> and the R package <code>RMySQL</code> without a problem.</p>

<p>However, when trying to connect using Mysql-Connector/Python:</p>

<pre><code># using mysql-connector-python-rf
import os
import mysql.connector
con = mysql.connector.connect(option_files=os.path.expanduser('~/.mylogin.cnf'))
</code></pre>

<p>or with PyMySQL:</p>

<pre><code># using pymysql
import os
import pymysql
con = pymysql.connect(option_files=os.path.expanduser('~/.mylogin.cnf'))
</code></pre>

<p>I get the same error:</p>

<pre><code>---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
&lt;ipython-input-64-d17e56ef7010&gt; in &lt;module&gt;()
----&gt; 1 con = mysql.connector.connect(option_files=os.path.expanduser('~/.mylogin.cnf'))

/usr/local/lib/python3.5/site-packages/mysql/connector/__init__.py in connect(*args, **kwargs)
    140     # Option files
    141     if 'option_files' in kwargs:
--&gt; 142         new_config = read_option_files(**kwargs)
    143         return connect(**new_config)
    144 

/usr/local/lib/python3.5/site-packages/mysql/connector/optionfiles.py in read_option_files(**config)
     66             config['option_files'] = [config['option_files']]
     67         option_parser = MySQLOptionsParser(list(config['option_files']),
---&gt; 68                                            keep_dashes=False)
     69         del config['option_files']
     70 

/usr/local/lib/python3.5/site-packages/mysql/connector/optionfiles.py in __init__(self, files, keep_dashes)
    162             self.files = files
    163 
--&gt; 164         self._parse_options(list(self.files))
    165         self._sections = self.get_groups_as_dict()
    166 

/usr/local/lib/python3.5/site-packages/mysql/connector/optionfiles.py in _parse_options(self, files)
    193                                      "than once in the list".format(file_))
    194                 with open(file_, 'r') as op_file:
--&gt; 195                     for line in op_file.readlines():
    196                         if line.startswith('!includedir'):
    197                             _, dir_path = line.split(None, 1)

/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/encodings/ascii.py in decode(self, input, final)
     24 class IncrementalDecoder(codecs.IncrementalDecoder):
     25     def decode(self, input, final=False):
---&gt; 26         return codecs.ascii_decode(input, self.errors)[0]
     27 
     28 class StreamWriter(Codec,codecs.StreamWriter):

UnicodeDecodeError: 'ascii' codec can't decode byte 0x96 in position 28: ordinal not in range(128)
</code></pre>

<p>Skimming over the source code, it looks like these are trying to read the files in cleartext. However, <code>mysql_config_editor</code> encrypts the login file it generates. Both modules work fine when entering the password manually in the code.</p>

<p>How can I connect to Python using one of these generated config files? I'm using Python 3, so MySQLdb isn't an option.</p>

<p>update: for now, I'm using <a href="http://rpy2.readthedocs.org/" rel="noreferrer">RPy2</a> to run queries in R and pipe the results back into Python. The code is a little ugly but the workflow isn't so bad.</p>