在没有显式绝对路径的情况下使用 sys.path.insert

Using sys.path.insert without explicit absolute path

刚开始使用 sys.path 从另一个目录启用模块导入,所以我确定这是一个菜鸟问题但是:

是否可以在使用 sys.path 访问另一个目录中的 Python 脚本时不必使用 full/explicit 或绝对文件路径,而是仅提供模块文件结构的本地目录路径?

目前,我的目录结构如下:

MyModule/
     NAME/
         __init__.py
     bin/
         userinfo.py
         __init__.py
     docs/
     setup.py
     tests/
         NAME_tests.py
         __init__.py

在 setup.py 文件中,我导入了 userinfo.py 脚本,它只是在安装过程中询问用户一些信息。在 setup.py 文件中,调用 userinfo.py 脚本的行如下所示:

import sys
sys.path.insert(0, '/Users/malvin/PythonDev/projects/MyModule/bin')
import userinfo 

这很好用,因为我知道 userinfo.py 文件所在的整个文件路径,但显然这对尝试安装该模块的人不起作用,因为(显然)无法预料用户系统上的文件路径。

我的问题:有没有一种方法可以导入 userinfo.py 文件(位于 /bin 文件夹中)而无需整个系统文件路径(一直到/Users) ?换句话说,我只想拥有类似的东西:

 import sys
 sys.path.insert(0, 'MyModule/bin')
 import userinfo

但我知道这行不通。

您可以对当前工作目录使用点 (./) 符号来建立相对路径。

例如:

(syspathinsert)macbook:syspathinsert joeyoung$ pwd
/Users/joeyoung/web/Whosebug/syspathinsert
(syspathinsert)macbook:syspathinsert joeyoung$ tree
.
├── MyModule.py
└── bin
    ├── userinfo.py
    └── userinfo.pyc

1 directory, 3 files
(syspathinsert)macbook:syspathinsert joeyoung$ cat ./bin/userinfo.py
def say_hello():
    print "hello there"

(syspathinsert)macbook:syspathinsert joeyoung$ cat MyModule.py 
import sys
sys.path.insert(0, './bin')
import userinfo

userinfo.say_hello()
(syspathinsert)macbook:syspathinsert joeyoung$ python MyModule.py 
hello there