Importing psi4 as a python module: psi4.set_active_molecule() causes seg fault

I have installed psi4 as an importable python module according to the instructions in the FAQ and most things seem to be working fine for me, but as soon as I try to either “set_legacy_molecule” or “set_active_molecule”, it causes a seg fault. Is there something I should be calling beforehand in order for this to work? I thought @loriab or @dgasmith might know the answer.

Here’s a minimal example:

import psi4

# this part works:
xyzstring = """
units angstrom
O     0.0000000000    0.0000000000   -0.0711762954
H     0.0000000000   -0.8916195680    0.5648097613
H     0.0000000000    0.8916195680    0.5648097613
"""
psi4.efp_init()
molecule = psi4.Molecule.create_molecule_from_string(xyzstring)
molecule.update_geometry()
molecule.print_out()

# this fails with "Segmentation fault (core dumped)":
psi4.set_legacy_molecule(molecule)

I believe you :slight_smile: but it works for me just now on Mac. Is your psi4.so Mac or Linux and maybe give the me otool -L or ldd -v (respectively)?

>>> import psi4
>>> psi4.set_global_option('BASIS', 'CC-PVDZ')
True
>>> print psi4.get_option('SCF', 'BASIS')
CC-PVDZ
>>> 
>>> # this part works:
... xyzstring = """
... units angstrom
... O     0.0000000000    0.0000000000   -0.0711762954
... H     0.0000000000   -0.8916195680    0.5648097613
... H     0.0000000000    0.8916195680    0.5648097613
... """
>>> psi4.efp_init()
<psi4.EFP object at 0x1007366e0>
>>> molecule = psi4.Molecule.create_molecule_from_string(xyzstring)
>>> molecule.update_geometry()
>>> molecule.print_out()
    Molecular point group: c2v
    Full point group: C2v

    Geometry (in Angstrom), charge = 0, multiplicity = 1:

       Center              X                  Y                   Z               Mass       
    ------------   -----------------  -----------------  -----------------  -----------------
           O          0.000000000000     0.000000000000    -0.071176298939    15.994914619560
           H          0.000000000000    -0.891619568000     0.564809757761     1.007825032070
           H         -0.000000000000     0.891619568000     0.564809757761     1.007825032070

>>> psi4.set_legacy_molecule(molecule)
>>> qw = psi4.get_legacy_molecule()
>>> qw.print_out()
    Molecular point group: c2v
    Full point group: C2v

    Geometry (in Angstrom), charge = 0, multiplicity = 1:

       Center              X                  Y                   Z               Mass       
    ------------   -----------------  -----------------  -----------------  -----------------
           O          0.000000000000     0.000000000000    -0.071176298939    15.994914619560
           H          0.000000000000    -0.891619568000     0.564809757761     1.007825032070
           H         -0.000000000000     0.891619568000     0.564809757761     1.007825032070

I’m running on Linux (ubuntu 14.04). Running ldd -v on psi4.so gives me

    linux-vdso.so.1 =>  (0x00007ffe667f1000)
    libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007f3897bc0000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f38979b8000)
    liblapack.so.3 => /usr/lib/liblapack.so.3 (0x00007f389721b000)
    libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f3895a12000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f389580e000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3895507000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f38951f5000)
    libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f3894fc7000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f3894daf000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3894b91000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f38947cc000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f38945b2000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f38943af000)
    libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f3894088000)
    /lib64/ld-linux-x86-64.so.2 (0x000055584d468000)
    libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f3893e48000)

    Version information:
    ./psi4.so:
        librt.so.1 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/librt.so.1
        libgcc_s.so.1 (GCC_3.4) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libpthread.so.0 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
        libgomp.so.1 (OMP_2.0) => /usr/lib/x86_64-linux-gnu/libgomp.so.1
        libgomp.so.1 (GOMP_2.0) => /usr/lib/x86_64-linux-gnu/libgomp.so.1
        libgomp.so.1 (OMP_1.0) => /usr/lib/x86_64-linux-gnu/libgomp.so.1
        libgomp.so.1 (GOMP_1.0) => /usr/lib/x86_64-linux-gnu/libgomp.so.1
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libdl.so.2 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libdl.so.2
        libstdc++.so.6 (CXXABI_1.3.1) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (GLIBCXX_3.4.11) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (GLIBCXX_3.4.9) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (CXXABI_1.3) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (GLIBCXX_3.4.15) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0:
        libz.so.1 (ZLIB_1.2.0) => /lib/x86_64-linux-gnu/libz.so.1
        libdl.so.2 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libdl.so.2
        libutil.so.1 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libutil.so.1
        libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libc.so.6 (GLIBC_2.15) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/librt.so.1:
        libpthread.so.0 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /usr/lib/liblapack.so.3:
        libgcc_s.so.1 (GCC_4.0.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libgfortran.so.3 (GFORTRAN_1.0) => /usr/lib/x86_64-linux-gnu/libgfortran.so.3
        libgfortran.so.3 (GFORTRAN_1.4) => /usr/lib/x86_64-linux-gnu/libgfortran.so.3
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
    /usr/lib/libblas.so.3:
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libpthread.so.0
    /lib/x86_64-linux-gnu/libdl.so.2:
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libm.so.6:
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /usr/lib/x86_64-linux-gnu/libstdc++.so.6:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libgcc_s.so.1 (GCC_4.2.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.3) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.18) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /usr/lib/x86_64-linux-gnu/libgomp.so.1:
        libpthread.so.0 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.6) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libgcc_s.so.1:
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libpthread.so.0:
        ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libc.so.6:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
    /lib/x86_64-linux-gnu/libz.so.1:
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libutil.so.1:
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /usr/lib/x86_64-linux-gnu/libgfortran.so.3:
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libgcc_s.so.1 (GCC_4.2.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.3) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_4.3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libquadmath.so.0 (QUADMATH_1.0) => /usr/lib/x86_64-linux-gnu/libquadmath.so.0
        libc.so.6 (GLIBC_2.6) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
    /usr/lib/x86_64-linux-gnu/libquadmath.so.0:
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.10) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6

@loriab I just tried cloning a fresh copy of psi4 and re-compiling to make sure my version is up to date, and the problem persists. I did notice something odd though – when I run the same commands in python interactive mode (like you did), I don’t see a seg fault complaint. I only see it if I run in normal mode (by which I mean executing “python script.py” or “./script.py” at the command line).

@avcopan Hmm works fine on my laptop as well, so I’m not quite sure what going.

As a side note what do you need this for? We are trying very hard to deprecate legacy and active molecules.

@dgasmith I’m writing a script that needs to call psi4.optking(). Basically, it implements a continuous sow-reap optimization that can run the single-point jobs for each gradient in parallel on our cluster. I need it in order to optimize structures with a research code (not ours – it’s from another group) that isn’t currently interfaced with an optimizer. I would prefer to avoid legacy/active molecules as well, but I believe optking still relies on them.

Yup, for now it does. RKing will be down here next week, hopefully we can patch some of this up.

Something to check: see is if the set_legacy is what actually creates the seg fault. You can do this simply by setting a print statement after the set_legacy call. If the set is not the source, but instead you get a seg fault when Psi is shutting down, try adding the following line at the very end of your infile.

psi4.set_legacy_molecule(None)

@dgasmith Oh – with psi4.set_legacy_molecule(None) I no longer get a seg fault complaint. Just adding a print statement after the call, the seg fault doesn’t show up until after the print statement is executed.

To clarify, I tried

psi4.set_legacy_molecule(molecule)
print("HELLO WORLD")

which gives

...
HELLO WORLD
Segmentation fault (core dumped)

but

psi4.set_legacy_molecule(molecule)
print("HELLO WORLD")
psi4.set_legacy_molecule(None)

results in

...
HELLO WORLD

without a seg fault complaint.

I can confirm the different behavior between interactive and script. And that psi4.set_active_molecule(mol) triggers it, too. But at the moment, I’m just confused.

Magic.

Cannot double or triple free.

Shared pointers can be the devil.

Working as intended.