优草派  >   Python

python调用自己写的模块

孙悦            来源:优草派

Python是一门动态语言,支持面向对象、函数式编程等多种编程范式,广泛应用于Web开发、数据分析、人工智能等领域。在Python中,模块是代码组织的基本单元,可以将相关的函数、类、变量等封装到一个模块中,方便重用和维护。本文将从多个角度分析如何在Python中调用自己写的模块。

一、模块的定义和导入

python调用自己写的模块

在Python中,一个模块就是一个.py文件,其中可以定义多个函数、类、变量等。下面是一个简单的模块示例:

```

# mymodule.py

def hello(name):

print("Hello, " + name + "!")

```

使用该模块的代码可以通过import语句导入:

```

import mymodule

mymodule.hello("world")

```

也可以使用from语句导入模块中的某个函数或变量:

```

from mymodule import hello

hello("world")

```

二、模块的搜索路径

Python解释器在导入模块时,会按照一定的搜索路径来查找模块文件。可以通过sys模块的path属性查看当前的搜索路径:

```

import sys

print(sys.path)

```

输出结果类似于:

```

['', '/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python39.zip', '/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9', '/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload', '/usr/local/lib/python3.9/site-packages', '/usr/local/Cellar/numpy/1.21.5_1/libexec/nose/lib/python3.9/site-packages', '/usr/local/lib/python3.9/site-packages/IPython/extensions', '/Users/username/.ipython']

```

其中,空字符串表示当前目录,其他字符串表示标准库和第三方库的安装路径。如果要导入自己写的模块,可以将模块文件放在当前目录或者任意一个搜索路径下,或者使用sys.path.append()方法添加一个新的搜索路径。

三、模块的命名空间

在Python中,每个模块都有自己的命名空间,可以通过模块名访问其中的函数、类、变量等。如果多个模块中定义了同名的函数或变量,可以使用模块名来区分它们。例如:

```

# mymodule.py

def hello():

print("Hello from mymodule!")

# main.py

import mymodule

def hello():

print("Hello from main!")

mymodule.hello() # 输出:Hello from mymodule!

hello() # 输出:Hello from main!

```

四、模块的重载和重新导入

在Python中,模块的导入只会在第一次执行时进行,后续的导入操作会直接使用缓存中的模块对象。如果想重新导入一个模块,可以使用importlib.reload()方法:

```

import importlib

import mymodule

mymodule.hello() # 输出:Hello from mymodule!

# 修改模块代码

with open("mymodule.py", "w") as f:

f.write("def hello():\n print('Hello from mymodule v2!')\n")

importlib.reload(mymodule)

mymodule.hello() # 输出:Hello from mymodule v2!

```

另外,Python还支持通过__name__属性来区分模块是被导入还是直接执行。在模块被导入时,__name__的值为模块名,而在模块直接执行时,__name__的值为"__main__"。可以利用这一特性,编写一些既可以作为模块导入,又可以直接执行的代码。例如:

```

# mymodule.py

def hello():

print("Hello from mymodule!")

if __name__ == "__main__":

hello()

```

这样,当mymodule被导入时,hello()函数不会自动执行,而只有在直接执行mymodule.py时,才会输出"Hello from mymodule!"。

五、模块的打包和发布

在实际开发中,可能会编写多个相关的模块,需要将它们打包成一个库,方便其他人使用。Python提供了setuptools和wheel等工具来打包和发布Python库。下面是一个简单的打包示例:

1. 创建setup.py文件

```

from setuptools import setup, find_packages

setup(

name="mymodule",

version="0.1",

packages=find_packages(),

install_requires=[

"numpy",

"pandas",

],

)

```

其中,name表示库的名称,version表示库的版本号,packages表示要打包的模块所在的目录,install_requires表示依赖的其他库。

2. 执行打包命令

```

python setup.py sdist bdist_wheel

```

这条命令会在dist目录下生成一个压缩包和一个.whl文件,可以通过pip install命令安装:

```

pip install dist/mymodule-0.1.tar.gz

pip install dist/mymodule-0.1-py3-none-any.whl

```

【原创声明】凡注明“来源:优草派”的文章,系本站原创,任何单位或个人未经本站书面授权不得转载、链接、转贴或以其他方式复制发表。否则,本站将依法追究其法律责任。
TOP 10
  • 周排行
  • 月排行