34

在组织 python 项目时,这种结构似乎是一种标准的做法:

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

我的问题是,如何导入我的core.py以便我可以使用它myscript

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

内容myscript

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

内容core.py

def main():
    print 'hello'

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

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

我错过了什么?

4

4 回答 4

6

通常,setup.py应该将包安装在 Python 解释器可以找到的地方,这样安装后就import mypackage可以工作了。为了方便bin从开发树中直接运行脚本,我通常会简单地添加一个 simlink 到../mypackage/目录bin。当然,这需要一个支持符号链接的文件系统……</p>

于 2012-07-23T12:44:42.543 回答
0

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

  1. 将我想运行的任何脚本放入 /bin

  2. 在目录 myproject 中执行“python -m bin.script”

  3. 在 script.py 中导入时,请考虑 script.py 作为 root 所在的目录。所以

    from ..mypackage import core
    

如果系统支持符号链接,这是一个更好的选择。

于 2013-07-18T20:24:04.350 回答
0

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

export PYTHONPATH=/home/username/bin:$PYTHONPATH
$ python
import module_from_bin
于 2019-12-04T11:49:07.297 回答
0

我按照setuptools 规范解决了这个问题。

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

packages = find_packages() 

这会找到所有模块。

ps 你必须导入这个函数:from setuptools import setup, find_packages

于 2020-02-10T21:45:48.860 回答