Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python setuptools develop command: "No module named..."

I'm trying to install a python package I've developed using the develop command of setuptools.

[sidenote: There is a bewilderingly vast quantity of information about this on the web (distutils, distutils2, setuptools, distribute). setuptools and develop are, as far as I can tell, the most modern/best practice way to use a piece of code that's in development. Perhaps I am wrong.]

Here's what I did:

(1) I placed an empty __init__.py in the directory with my Python code.

(2) I made a setup.py:

from setuptools import setup, find_packages
setup(name = "STEM_pytools",
      version = "0.1",
      packages = find_packages(),

      author = "Timothy W. Hilton",
      author_email = "[email protected]",
      description = "visualization and data pre-/post-processing tools for STEM",
      license = "",
      keywords = "STEM",
      url = "")

(3) I ran

python setup.py develop

That seemed to proceed without problems.

However, when I try to use the package, I get:

>>> import STEM_pytools
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named STEM_pytools

The same thing happens with the install command: it's output looks ok, then "No module named STEM_pytools". I'm tearing my hair out. Any suggestions appreciated!

like image 439
Timothy W. Hilton Avatar asked Oct 21 '22 10:10

Timothy W. Hilton


1 Answers

I solved the problem, although I still don't entirely understand why it works now and did not work before. It seems my setup.py and the directory structure of my project were not interacting successfully.

This is the directory structure that worked with my setup.py:

STEMpytools/
    setup.py
    stem_pytools/
        __init__.py
        source1.py
        source2.py
        ...
        sourceN.py

This directory structure did not work, at least when paired with my setup.py:

STEMpytools/
    setup.py
    __init__.py
    source1.py
    source2.py
    ...
    sourceN.py

This explanation helped me a lot: http://bashelton.com/2009/04/setuptools-tutorial/
Now, from the python interpreter, these both work:

import stem_pytools
import stem_pytools.source1

Experimenting on my system suggests it is necessary to place __init__.py and the package source code in a subdirectory one level below the root directory that contains setup.py. I'm not sure from the setuptools and distutils documentation why this is the case.

like image 135
Timothy W. Hilton Avatar answered Oct 23 '22 01:10

Timothy W. Hilton