tags:

views:

37

answers:

3

Hello,

I am new to Python and mostly used my own code. But so now I downloaded a package that I need for some problem I have.

Example structure:

root\
    externals\
        __init__.py
        cowfactory\
            __init__.py
            cow.py
            milk.py

    kittens.py

Now the cowfactory's __init__.py does from cowfactory import cow. This gives an import error.

I could fix it and change the import statement to from externals.cowfactory import cow but something tells me that there is an easier way since it's not very practical.

An other fix could be to put the cowfactory package in the root of my project but that's not very tidy either.

I think I have to do something with the __init__.py file in the externals directory but I am not sure what.

+1  A: 

generally, you would use easy_install our pip to install it for you in the appropriate directory. There is a site-packages directory on windows where you can put the package if you can't use easy_install for some reason. On ubuntu, it's /usr/lib/pythonX.Y/dist-packages. Google for your particular system. Or you can put it anywhere on your PYTHONPATH environment variable.

As a general rule, it's good to not put third party libs in your programs directory structure (although there are differing opinions on this vis a vis source control). This keeps your directory structure as minimalist as possible.

aaronasterling
aha I see, but with Google App Engine to include 3rd part libs you have to include them in your project's directory.
Pickels
@Pickels, you should edit your question to make it clear that you're on GAE.
aaronasterling
I thought about it but I know now how to use external packages with GAE because of the info I got here so I am pretty satisfied.
Pickels
A: 

The easiest way is to use the enviroment variable $PYTHONPATH. You set it before running your scripts as follows:

export $PYTHONPATH=$PYTHONPATH:/root/externals/

You can add as many folders as you want (provided their separate by :) and python will look in all those folders when importing.

kirbuchi
+1  A: 

Inside the cowfactory package, relative imports should be used such as from . import cow. The __init__.py file in externals is not necessary. Assuming that your project lies in root\ and cowfactory is the external package you downloaded, you can do it in two different ways:

  1. Install the external module

    External Python packages usually come with a file "setup.py" that allows you to install it. On Windows, it would be the command "setup.py bdist_wininst" and you get a EXE installer in the "dist" directory (if it builds correctly). Use that installer and the package will be installed in the Python installation directory. Afterwards, you can simply do an import cowfactory just like you would do import os.

    If you have pip or easy_install installed: Many external packages can be installed with them (pip even allows easy uninstallation).

  2. Use PYTHONPATH for development

    If you want to keep all dependencies together in your project directory, then keep all external packages in the externals\ folder and add the folder to the PYTHONPATH. If you're using the command line, you can create a batch file containing something like

    set PYTHONPATH=%PYTHONPATH%:externals
    yourprogram.py
    

    I'm actually doing something similar, but using PyDev+Eclipse. There, you can change the "Run configurations" to include the environment variable PYTHONPATH with the value "externals". After the environment variable is set, you can simply import cowfactory in your own modules. Note how that is better than from external import cowfactory because in the latter case, it wouldn't work anymore once you install your project (or you'd have to install all external dependencies as a package called "external" which is a bad idea).

Same solutions of course apply to Linux, as well, but with different commands.

AndiDog
Thanks, in GAE I need to include external libraries inside the project. You're answer cleared up a few things I saw in other GAE projects/examples.
Pickels