trinth
trinth

Reputation: 6037

Why does my python not add current working directory to the path?

I keep seeing sites mentioning that the directory that you execute 'python ' get added to the python path. For example on http://www.stereoplex.com/blog/understanding-imports-and-pythonpath, the author cd's to the /tmp folder then does 'print(sys.path)' and lo and behold, the /tmp folder appears in the path list. Here is me trying this out on my system (with 2.6.6 installed):

example structure:

app/
  mymodule.py
  inner_folder/
    myscript.py

in myscript.py contains the line:

import mymodule.py

what I did:

cd app
python inner_folder/myscript.py # ImportError

Since I am executing the interpreter from the app/ directory, shouldn't 'app' be added to the python path? This is how a lot of the docs I have been reading have specified the behaviour should be.

Please enlighten!

(I have temporarily solved this by manually adding the folder I want into the environment but don't want to rely on that forever. Since many sites say this can be done, I'd like to reproduce it for myself)

Upvotes: 53

Views: 27699

Answers (4)

Tong Zhou
Tong Zhou

Reputation: 626

In my experience, the cleanest solution is to add a setup.py like this structure:

app/
  __init__.py
  mymodule.py
  inner_folder/
    myscript.py
setup.py

And the content of setup.py looks like this:

from setuptools import setup

setup(
    name='my-app',
    version='0.1',
    packages=['app'],
    install_requires=[
          # a list of required packages if needed
      ],
)

After installing via python setup.py develop, in myscript.py, you can import mymodule like this:

import app.mymodule

Or if you want to do import mymodule, you can move setup.py inside app/, same directory as mymodule.py, and change packages=['app'] to packages=[],.

Upvotes: 0

Anthony Hayward
Anthony Hayward

Reputation: 2322

Check that the module directory is not empty. That may sound stupid, but in my case I hadn't realised that it was a git submodule and hadn't cloned recursively.

Upvotes: 0

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798456

It is the script's directory that is added, not the current directory. If you turn inner_folder/ into a package then you can use python -m inner_folder.myscript in order to run the script while having app/ added to sys.path.

Upvotes: 84

André Caron
André Caron

Reputation: 45239

Whether or not the current directory is in sys.path, import statements usually look like:

import mymodule

The code you wrote looks like:

import 'mymodule.py'

Upvotes: 4

Related Questions