python - python3中从文件导入函数的正确方法

标签 python python-3.x

我正在为一些脚本构建一个简单的 python3 CLI。我在导入位于同一模块的文件中的自己的函数时遇到问题。

我的文件结构是

pycli/
├── README.md
├── pycli
  ├── __init__.py
  ├── cli.py
  └── funcmodule.py

funcmodule.py:

def my_function(word):
    print("Hello %s" % word)

cli.py:

#!/usr/bin/env python3

from pycli.funcmodule import my_function


def main():
    my_function('hello world')


if __name__ == '__main__':
    main()

当我从命令行运行 ./pycli/cli.py 时,我得到

(venv) ➜  ./pycli/cli.py 
Traceback (most recent call last):
  File "./pycli/cli.py", line 3, in <module>
    from pycli.funcmodule import my_function
ModuleNotFoundError: No module named 'pycli'

当我从 PyCharm 或 Visual Studio Code 中运行 cli.py 时,它可以正常工作。使用 python3+ 导入函数的正确方法是什么(我不关心 python2)?

最佳答案

这是您运行程序的方式与导入设置方式之间的不匹配。您的导入设置就像涉及一个包一样,但您运行该程序就像没有包一样。

按照您运行程序的方式,内部pycli文件夹的内容都是顶级模块,并且没有pycli包。要将程序作为包子模块运行,您需要从可导入 pycli 包的某个位置执行此操作(实际上,该包位于外部 pycli 文件夹内,但如果您安装了软件包,则可以在任何地方),并且您需要运行

python -m pycli.cli

关于python - python3中从文件导入函数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60316919/

相关文章:

python - 在 Python 3 中打开 Python 2 Pickle 文件时出现 TypeError : a bytes-like object is required, 而不是 'str'

Python Gtk 按钮

python - cx_freeze 无法导入 numpy

python - 列上的十分位数 Pandas DataFrame

python - Django迁移1100万行,需要分解

python - 如何使用 url 在 Python 中访问 s3 文件?

python - PyTorch - 按元素签名的最小值/最大值?

linux - 如何将 "tar"shell 命令翻译成 Python

python - 使函数不等待其内部的其他函数

python - 仅在一个模块中修补方法