【问题标题】:How to import your package/modules from a script in bin folder in python如何从 python 的 bin 文件夹中的脚本导入包/模块
【发布时间】:2020-05-19 02:55:10
【问题描述】:

在组织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'

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

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

我错过了什么?

【问题讨论】:

  • 您的sys.path 值(由PYTHONPATH 环境变量修改或在运行时由Python 代码修改)决定import 将在何处搜索模块。
  • 考虑在setup.py中使用entry_points["console_scripts"]'
  • setup.py的内容是什么?它在 myproject 目录中吗?
  • 为什么不安装你的包 (python setup.py etc)运行你的脚本之前?
  • 我正处于开发阶段,所以我宁愿不要每次更改都安装它,看看它是否有效。

标签: python


【解决方案1】:

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

【讨论】:

  • 按照您的建议使用符号链接,脚本能够找到 mypackage,但我现在遇到了另一个问题...请参阅上面的问题中的编辑。
  • 不要在开发中使用“聪明”符号链接,而是使用 virtualenv 并运行 python setup.py develop 让 distutils 在您的路径中安装可执行文件(当您激活该 virtualenv 时)
  • 其实那个问题我也想通了。
  • @TokenMacGuy:virtualenv 似乎是一个不错的解决方案,我必须了解更多。
  • @TokenMacGuy:我同意 virtualenv 是更灵活和健壮的解决方案。但是,对于简单的情况(单个模块或包),使用符号链接对我来说总是很好。符号链接更容易设置,并且允许在不运行python setup.py 的情况下测试命令行工具,因此它也有其优点。
【解决方案2】:

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

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

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

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

    from ..mypackage import core
    

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      packages = find_packages() 
      

      这会找到所有模块。

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

      【讨论】:

        猜你喜欢
        • 2012-06-03
        • 2013-08-26
        • 2018-06-01
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多