如何从python中bin文件夹中的脚本导入包/模块

时间:2012-07-23 12:40:28

标签: python

组织python项目时,这种结构似乎是一种标准的方式:

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

我的问题是,如何导入mycore.py以便我可以在myscript中使用它?

两个__init__.py个文件都是空的。

myscript的内容:

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

core.py的内容

def main():
    print 'hello'

当我从myproject目录中运行myscript时,出现以下错误:

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

我错过了什么?

4 个答案:

答案 0 :(得分:4)

通常,setup.py应该将软件包安装在Python解释器可以找到的位置,因此安装后import mypackage将起作用。为了便于在开发树中运行bin中的脚本,我通常只需将../mypackage/的simlink添加到bin目录。当然,这需要一个支持符号链接的文件系统......

答案 1 :(得分:0)

我不确定是否有“最佳选择”,但以下是我的常规做法:

  1. 放入我想在/ bin

  2. 中运行的任何脚本
  3. 在dir myproject中执行“python -m bin.script”

  4. 在script.py中导入时,请考虑script.py以root身份进行的目录。所以

    from ..mypackage import core
    
  5. 如果系统支持符号链接,那么它是更好的选择。

答案 2 :(得分:0)

我通常将我的bin路径添加到$ PYTHONPATH中,这将使python也可以在bin目录中查找要求的模块。

export PYTHONPATH=/home/username/bin:$PYTHONPATH
$ python
import module_from_bin

答案 3 :(得分:0)

我解决了setuptools specifications之后的问题。

在setup.py 中,您可以指定模块 as an argument for the function setup()

packages = find_packages() 

找到所有模块。

p.s。您必须导入以下功能:from setuptools import setup, find_packages