簡體   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