繁体   English   中英

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

[英]Correct way to import functions from file in python3

我正在为一些脚本构建一个简单的 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 (实际上,该包位于外部pycli文件夹内,但如果您安装了包,则可以在任何位置),并且您需要跑步

python -m pycli.cli

所以我需要的是用setup.py创建一个合适的包:

from setuptools import setup
setup(
    name = 'pycli',
    version = '0.1.0',
    packages = ['pycli'],
    entry_points = {
        'console_scripts': [
            'pycli = pycli.cli:main'
        ]
    })

为了从终端运行它

pip3 install .

pycli
Hello hello world 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM