Solved

Using mingw to expose object libraries to C compiler and eventually have psycopg2 work

Posted on 2010-11-22
10
996 Views
Last Modified: 2012-05-10
I am trying to install the adapter psycopg2 for postgresql. (32-bit Win32 on an XP box).  Apparently there's a never ending loop of garbage that I have to get through in order to do this.  

1) I first create a site to hold a new django project
2) I then create a new project using 'django-admin.py startproject xxx".  This works fine.
3) I then downloaded and installed the psycopg2 database adapter, which initially seemed to go fine.
4) I then set up my setting file, with the following parameters:

[settings file]
DATABASES = {
    'default': {
        'ENGINE': 'postgresql_psycopg2', # Add 'django.db.backends.', 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'first',                      # Or path to database file if using sqlite3.
        'USER': 'Charlie Shore',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Please note that the database name and user are legitimate.

5) When I now go to the site directory on the command line, and type 'python manage.py shell', the output erred out with the following message:

Output:  File "C:\Python26\lib\site-packages\django\db\backends\postgresql_psycopg2\bas
e.py", line 24, in <module>
    raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: DLL
load failed: The specified module could not be found.

6) Now I change the database name (in the setting file) to 'django.db.backends.', and am able to get the interactive manager.

7) Following on step 6, I'm able to connect interactively using 'from django.db import connection'.  But then when I try to define my cursor (cursor = connection.cursor()), I get the following:

Output: Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python26\lib\site-packages\django\db\backends\dummy\base.py", line 15
, in complain
    raise ImproperlyConfigured("You haven't set the database ENGINE setting yet.
")
ImproperlyConfigured: You haven't set the database ENGINE setting yet.

8) As I understand it, (at least on most OS), I now need both the python-dev and libpg_dev modules for this to work right.  But maybe on Windows, I only need to expose the object libraries to the C compiler.  So I then installed the MinGW GNU development environment to the default location.

9) Using MinGW-get, I then installed the gcc, g++, binutils, and win32api components.  Although most things seem to install OK, I get a message 'mingw-get: *** ERROR *** package: unknown package' with each new package.

10) Finally I run the command shown on the next line, with the following result:

C:\Python26>gcc -I\python26\include -l\python26 -L\python26\libs

Output: c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../libmingw32.a(main.o):main.c:(.tex
t+0xd2): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

At this point I'm so confused I don't know which way to go.  If I can just start by getting gcc to work, I may be able to work my way back up this tortuous chain.

Thanks in advance.

0
Comment
Question by:cshore12
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 5
10 Comments
 
LVL 8

Expert Comment

by:LunarNRG
ID: 34190163
Let's back up a little. You say that the psycopg2 install seemed to go fine (in step 3) ...

Please post the output of the following commands?
c:\> python --version
c:\> python -c "import os; print os.__file__"
c:\> python -c "import psycopg2; print psycopg2.__version__"
c:\> python -c "import django; print django.get_version()"

Open in new window


What version of the psycopg2 installer are you using? These are usually tied to a specific python version. Did you use easy_install? Do you have more than one version of python installed?
0
 

Author Comment

by:cshore12
ID: 34190601
Thanks for your rapid response:

1) python 2.6.6

2) C:\Python26\lib\os.pyc

3) Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python26\lib\site-packages\psycopg2\__init__.py", line 69, in <module
>
    from _psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID
ImportError: DLL load failed: The specified module could not be found.

4) 1.2.3

I obviously misstated my case when I said that psycopg2 had installed directly.  I originally thought I had installed psycopg2-2.2.2, but then was led to believe that I had to expose the object libraries and header files to the C compiler for psycopg2 to be fully installed:

The concept of "python-dev package" is a Debian concept which doesn't
apply to Windows. The standard installation on Windows provides the
header and library files that you need for interfacing with C.

Don't put things where your C compiler can find them; do a standard
no-frills install of Python2.4 using the .msi installer and tell your C
compiler where the goodies are.

E.g. using the MinGW32 gcc, you'd need things like:

gcc -I\python24\include -lpython24 -L\python24\libs
0
 
LVL 8

Expert Comment

by:LunarNRG
ID: 34190829
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:cshore12
ID: 34193047
No, I downloaded a tar file (specifically, psycopg2-2.2.2.tar).  From your question, I take it that Windows will only work with the binaries.  Should I get rid of my current psycopg files/folders and reinstall based on your recommended path?
0
 
LVL 8

Expert Comment

by:LunarNRG
ID: 34196821
No, you can compile from source on windows. I've done it before, but not recently. However, if you don't have a good reason to do this, ie. you need to change some pre-compile time configuration option, then you're just punishing yourself. I'd go with the binary installer.

You should be able to just install over the top of what you have, but if you have the same, or a similar, issue after installing the binary package then get rid of the current psycopg files/folders and try again.

HTH
0
 

Author Comment

by:cshore12
ID: 34209383
I downloaded the executable and entered the commands as before.  Although I used several different values for database name and user (In my setting file), I consistently got the attached error.  

The databases I tried to tap into were either owned by 'Charlie Shore' or postgres.  Therefore, it doesn't seem to matter what database name or user I use in the settings file.  Is there a way to parse the connection string to see what's going on?

Have a great Thanksgiving! dajngo-conn-string-error.txt
0
 

Author Comment

by:cshore12
ID: 34226733
Eureka!  I created a third user and, after putting its name in the settings file, am now able to proceed with the project.  Apparently 'Charlie Shore' wasn't accepted either because it's two words, or possibly because I'm the database owner.  I can also see why user postgres was also not acceptable.
0
 
LVL 8

Expert Comment

by:LunarNRG
ID: 34243970
Hmmm, interesting.

I think that might be a bug in psycopg2 -- or there is a special way to quote the whitespace that I've not seen before.

Honestly, I've never worked with a username that included spaces -- strange. I can reproduce your error by calling psycopg2.connect with "... user='test user' ... ", and several variations.

If I figure out the work-around, I'll post it here.

btw - sorry for the delayed response. I hope you had a great Thanksgiving as well.
0
 
LVL 8

Accepted Solution

by:
LunarNRG earned 500 total points
ID: 34244068
Okay, sorry again. My bad.

Try this ... (wrap in double-quotes, leave single-quotes)

... 
'USER': "'Charlie Shore'"
...

Open in new window


Whitespace in usernames should work fine, if quoted properly.

HTH!
0
 

Author Closing Comment

by:cshore12
ID: 34268875
LunarNPG -- Well, I've moved on.  I created a superuser with no white spaces, and that seems to work fine.  At some point I'll try your suggestion to single quote around the white spaces.  In the meantime, the points are yours...
0

Featured Post

NEW Veeam Agent for Microsoft Windows

Backup and recover physical and cloud-based servers and workstations, as well as endpoint devices that belong to remote users. Avoid downtime and data loss quickly and easily for Windows-based physical or public cloud-based workloads!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Flask is a microframework for Python based on Werkzeug and Jinja 2. This requires you to have a good understanding of Python 2.7. Lets install Flask! To install Flask you can use a python repository for libraries tool called pip. Download this f…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.

735 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question