How to import your package/modules from a script in bin folder in python

When organising python project, this structure seems to be a standard way of doing it:

myproject\
    bin\
        myscript
    mypackage\
        __init__.py
        core.py
    tests\
        __init__.py
        mypackage_tests.py
setup.py

My question is, how do I import mycore.py so I can use it in myscript?

both __init__.py files are empty.

Content of myscript:

#!/usr/bin/env python
from mypackage import core
if __name__ == '__main__':
    core.main()

Content of core.py

def main():
    print 'hello'

When I run myscript from inside myproject directory, I get the following error:

Traceback (most recent call last):
  File "bin/myscript", line 2, in <module>
    from mypackage import core
ImportError: No module named mypackage

What am I missing?

Answers


Usually, setup.py should install the package in a place where the Python interpreter can find it, so after installation import mypackage will work. To facilitate running the scripts in bin right from the development tree, I'd usually simply add a simlink to ../mypackage/ to the bin directory. Of course, this requires a filesystem supporting symlinks…


I'm not sure if there is a "best choice", but the following is my normal practice:

  1. Put whatever script I wanna run in /bin

  2. do "python -m bin.script" in the dir myproject

  3. When importing in script.py, consider the dir in which script.py is sitting as root. So

    from ..mypackage import core
    

If the system supports symlink, it's a better choice.


Need Your Help

Making a Location object in Android with latitude and longitude values

android location distance

I have a program in which latitude and longitude values of a location are stored in a database, which I download.

How to capture finger movement direction in android phone?

android

I want to capture the finger movement direction on Android touch phone. If a user slides his finger in up/down/left/right direction, I want to capture this direction. How can I find this? Thanks.