Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Structuring python projects without path hacks

I have a shared python library that I use in multiple projects, so the structure looks like this:

Project1
    main.py <--- (One of the projects that uses the library)
...
sharedlib
    __init__.py
    ps_lib.py
    another.py

Now in each project's main.py I use the following hack to make it work:

import os
import sys
sys.path.insert(0, os.path.abspath('..'))

import sharedlib.ps_lib
...

Is there a way to do it without using this hack? Or is there a better way to organize the projects structure?

like image 850
Drxxd Avatar asked Aug 16 '17 10:08

Drxxd


1 Answers

I think the best way would be to make sharedlib a real package. That means changing the structure a bit:

sharedlib/
    sharedlib/
        __init__.py
        ps_lib.py
        another.py
    setup.py

And using something like this in the setup.py (taken partially from Python-packaging "Minimal Structure"):

from setuptools import setup

setup(name='sharedlib',
      version='0.1',
      description='...',
      license='...',
      packages=['sharedlib'],   # you might need to change this if you have subfolders.
      zip_safe=False)

Then install it with python setup.py develop or pip install -e . when in the root folder of the sharedlib package.

That way (using the develop or -e option) changes to the contents of sharedlib/sharedlib/* files will be visible without re-installing the sharedlib package - although you may need to restart the interpreter if you're working in an interactive interpreter. That's because the interpreter caches already imported packages.

From the setuptools documentation:

Setuptools allows you to deploy your projects for use in a common directory or staging area, but without copying any files. Thus, you can edit each project’s code in its checkout directory, and only need to run build commands when you change a project’s C extensions or similarly compiled files. [...]

To do this, use the setup.py develop command.

(emphasis mine)

The most important thing is that you can import sharedlib everywhere now - no need to insert the sharedlib package in the PATH or PYTHONPATH anymore because Python (or at least the Python where you installed it) now treats sharedlib like any other installed package.

like image 101
MSeifert Avatar answered Oct 05 '22 06:10

MSeifert