18

I have created a virtual environment without the system packages with python's virtualenv in Ubuntu and installed m2crypto, but when I execute a shell and I try to import M2Crypto i get the following error:

ImportError: /home/imediava/.virtualenvs/myenv/local/lib/python2.7/site-          
packages/M2Crypto/__m2crypto.so: undefined symbol: SSLv2_method

From outside the environment I run into the same problem unless from ubuntu I install python-m2crypto with apt-get. I know that I could create the environment with the system packages but I would prefer not to do it.

Is there anyway that I could create a virtual environment without the system packages and then install m2crypto with pip without running into the SSLv2_method?

tshepang
  • 12,111
  • 21
  • 91
  • 136
txominpelu
  • 1,067
  • 1
  • 6
  • 11

5 Answers5

31

There seems to be a regression bug from an earlier version of M2Crypto.

After placing M2Crypto's source in your virtualenv, you can try to patch it with the diff code below.

You do this by downloading the source code, untar it via: tar -xzf M2Crypto-0.21.1.tar.gz

This should create the directory M2Crypto-0.21.1 which will contain the SWIG directory

In SWIG you'll find _ssl.i, which is the file to be patched. In the same directory create a file called _ssl.i.patch for example using the nano editor and paste the complete diff code listed below into it.

Next issue the patch _ssl.i _ssl.i.patch command to merge the patch into the code. (Afterwards you may remove the patch file if you want.)

Finally issue the commands:

python setup.py build

followed by:

python setup.py install

to install manually.

diff code:

--- SWIG/_ssl.i 2011-01-15 20:10:06.000000000 +0100
+++ SWIG/_ssl.i 2012-06-17 17:39:05.292769292 +0200
@@ -48,8 +48,10 @@
 %rename(ssl_get_alert_desc_v) SSL_alert_desc_string_long;
 extern const char *SSL_alert_desc_string_long(int);

+#ifndef OPENSSL_NO_SSL2
 %rename(sslv2_method) SSLv2_method;
 extern SSL_METHOD *SSLv2_method(void);
+#endif
 %rename(sslv3_method) SSLv3_method;
 extern SSL_METHOD *SSLv3_method(void);
 %rename(sslv23_method) SSLv23_method;
Harald Brinkhof
  • 4,375
  • 1
  • 22
  • 32
Bosse Klykken
  • 410
  • 1
  • 4
  • 7
  • 1
    There are several M2Crypto forks on Github meanwhile; I added mine to have this excellent patch (https://github.com/tobiasherp/M2Crypto). – Tobias Sep 03 '13 at 16:19
  • @bosse-klykken Could you please contact me either commenting on https://gitlab.com/m2crypto/m2crypto/commit/b333e591d076154cbf3171b97877d4bd645f64a8 or via email (mcepl at redhat dot com), so that I can acknowledge you as an author of this patch, please? Thank you. – mcepl Oct 14 '15 at 07:26
15

You can install this lib in your global environment and then just copy from your global site-packages to virtualenv.

Denis
  • 7,127
  • 8
  • 37
  • 58
  • Thanks, I don't have my ubuntu right now but I'll try it later. Is it that simple to do? Don't you think there would be other problems? – txominpelu May 11 '12 at 10:33
  • Thanks, it did work! Now I guess is up to the guys either from ubuntu or from m2crypto to figure out why the pypi version doesn't work for ubuntu. – txominpelu May 12 '12 at 18:10
  • 7
    Thanks. I copied M2Crypto from ''dist-packages'' successfully, e.g.: from: /usr/lib/python2.7/dist-packages/M2Crypto to: ~/.virtualenvs/XXX/lib/python2.7/site-packages/ – Jeff Bauer Sep 23 '12 at 01:44
  • 6
    Refer to http://stackoverflow.com/a/8219807/1231384. Also, instead of copying the entire directory, remember you can just symlink: ln -s /usr/lib/python2.7/dist-packages/M2Crypto ~/virtualenvs/XXX/lib/python2.7/site-packages/M2Crypto – cjlarose Nov 29 '12 at 00:13
5

M2Crypto 0.22.3 (the current version in pypi) fixes this problem, so the simplest solution is now simply:

pip install --upgrade M2Crypto

M2Crypto 0.22.3 has been released from martinpaljak's github repository, rather than from the original M2Crypto repository.

richvdh
  • 1,163
  • 11
  • 19
2

I had the same problem with the current release (M2Crypto-0.22.5). The latest RC build worked for me.

pip install M2Crypto==0.22.6rc4
thepner
  • 479
  • 3
  • 13
0

There is a patch slated for 0.26.1.

In the meantime, you can clone the repo, apply the patch, and install from source.

git clone https://gitlab.com/m2crypto/m2crypto.git
(
    cd m2crypto
    git checkout 0.25.1
    curl 'https://gitlab.com/m2crypto/m2crypto/merge_requests/117.diff' | git apply -v
)
pip install -U m2crypto
augurar
  • 12,081
  • 6
  • 50
  • 65