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

k4emjkb1  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(110)

我正在为一些脚本构建一个简单的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)?

cmssoen2

cmssoen21#

这是运行程序的方式和导入的设置方式之间的不匹配。导入的设置就好像有一个包涉及一样,但是运行程序的过程就像没有包一样。
按照运行程序的方式,内部pycli文件夹的内容都是顶级模块,没有pycli包。要将程序作为包子模块运行,您需要从pycli包可导入的某个地方执行此操作(实际上,该包位于pycli外部文件夹内,但如果您安装了包,则可以位于任何地方),并且您需要运行

python -m pycli.cli

字符串

x6492ojm

x6492ojm2#

所以我需要用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

相关问题