8

I’m using Amazon Linux, in which the default Python version is 2.7. I YUM installed 3.7 and changed the alias python=python3.

Now when I do python -V, I’m getting: Python 3.7.6. I run pip3 install psycopg2.

And I am getting:

pip3 install psycopg2
Defaulting to user installation because normal site-packages is not writeable
Collecting psycopg2
  Using cached psycopg2-2.8.5.tar.gz (380 kB)
    ERROR: Command errored out with exit status 1:
     command: /bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-b3bpay2i/psycopg2/setup.py'"'"'; __file__='"'"'/tmp/pip-install-b3bpay2i/psycopg2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-3c18jwyz
         cwd: /tmp/pip-install-b3bpay2i/psycopg2/
    Complete output (23 lines):
    running egg_info
    creating /tmp/pip-pip-egg-info-3c18jwyz/psycopg2.egg-info
    writing /tmp/pip-pip-egg-info-3c18jwyz/psycopg2.egg-info/PKG-INFO
    writing dependency_links to /tmp/pip-pip-egg-info-3c18jwyz/psycopg2.egg-info/dependency_links.txt
    writing top-level names to /tmp/pip-pip-egg-info-3c18jwyz/psycopg2.egg-info/top_level.txt
    writing manifest file '/tmp/pip-pip-egg-info-3c18jwyz/psycopg2.egg-info/SOURCES.txt'

    Error: pg_config executable not found.

    pg_config is required to build psycopg2 from source.  Please add the directory
    containing pg_config to the $PATH or specify the full executable path with the
    option:

        python setup.py build_ext --pg-config /path/to/pg_config build ...

    or with the pg_config option in 'setup.cfg'.

    If you prefer to avoid building psycopg2 from source, please install the PyPI
    'psycopg2-binary' package instead.

    For further information please check the 'doc/src/install.rst' file (also at
    <https://www.psycopg.org/docs/install.html>).

    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

I try to pip3 the binary with: pip3 install psycopg2-binary

And I did:

pip3 -list

And the result is:

Package         Version Location                                          Installer
--------------- ------- ------------------------------------------------- ---------
pip             20.1    /usr/local/lib/python3.7/site-packages            pip
psycopg2-binary 2.8.5   /home/ec2-user/.local/lib/python3.7/site-packages pip
setuptools      38.4.0  /usr/lib/python3.7/site-packages                  pip
wheel           0.34.2  /home/ec2-user/.local/lib/python3.7/site-packages pip

And when I check if file does exist:

ls -l /home/ec2-user/.local/lib/python3.7/site-packages
total 4
drwxrwxr-x 3 ec2-user ec2-user  302 Apr 30 15:06 psycopg2
drwxrwxr-x 2 ec2-user ec2-user  102 Apr 30 15:06 psycopg2_binary-2.8.5.dist-info
drwxrwxr-x 2 ec2-user ec2-user 4096 Apr 30 15:06 psycopg2_binary.libs
drwxrwxr-x 4 ec2-user ec2-user  233 Apr 30 16:03 wheel
drwxrwxr-x 2 ec2-user ec2-user  130 Apr 30 16:03 wheel-0.34.2.dist-info

I also installed postgresql10 client using:

sudo amazon-linux-extras install postgresql10

Why am I still getting the error?

4
  • 1
    "pg_config is required to build psycopg2 from source" is why you get the error. the -binary package is an alternative, not an additon, you shouldn't have both installed Commented Apr 30, 2020 at 17:24
  • what is pg_config and how do i install it ? do i need also gcc installed ? Commented Apr 30, 2020 at 18:31
  • 1
    The binary packages come with their own versions of a few C libraries, among which libpq and libssl, which will be used regardless of other libraries available on the client: upgrading the system libraries will not upgrade the libraries used by psycopg2. Build psycopg2 from source if you want to maintain binary upgradeability. Commented Oct 30, 2020 at 7:47
  • And yes, you will need gcc installed Commented Oct 30, 2020 at 8:06

1 Answer 1

31

From the documentation:

The psycopg2-binary package is meant for beginners to start playing with Python and PostgreSQL without the need to meet the build requirements.

If you are the maintainer of a published package depending on psycopg2 you shouldn’t use psycopg2-binary as a module dependency. For production use you are advised to use the source distribution..

Since this package is needed in order to connect to the PostgreSQL database, you will need libpq. psycopg2 library is built as a wrapper around libpq. It requires some PostgreSQL binaries and headers required for building 3rd-party applications for PostgreSQL. Run:

sudo apt install python3-dev libpq-dev

The main goal of the command above is to provide all requirements for building psycopg2. To install the latest package in your system, use pip:

pip3 install psycopg2

If you cannot find the pg_config, check your PATH. Chances are it is not in your PATH.

On Alpine, the library containing pg_config is postgresql-dev. To install, run:

apk update && \
 apk add postgresql-dev gcc python3-dev musl-dev

# Then you can install pyscopg2 say from your requirements.txt file or manually
Sign up to request clarification or add additional context in comments.

2 Comments

Why is it not advised to use the binary package for production use?
@GunarGessner a bit late, but according to the psycopg-vs-psycopg-binary docs there are several reasons, e.g. upgradeability and potential libssl conflicts.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.