在Python
中,每个模块都有一个内置的变量 name
,用于表示当前模块的名称。当一个Python
文件被执行时,Python
解释器会首先将该文件作为一个模块导入,并执行其中的代码。此时,__name__
的值为模块的名称。
作用
- 模块可被导入也可直接执行:使一个
Python
脚本既可以作为一个独立的程序运行,也可以被其他脚本作为模块导入。 - 减少全局污染:当脚本作为模块被导入时,可以避免执行不必要的代码,提高代码的整洁度和可维护性。
- 测试代码:可以编写一些测试代码,只在直接运行脚本时执行,而不影响作为模块导入时的行为。
使用场景
- 脚本和模块分离:使脚本既可以独立运行,也可以作为模块导入。
- 单元测试:在脚本中编写一些测试代码,只在直接运行时执行。
- 初始化资源:在脚本直接运行时初始化一些资源,例如数据库连接等。
示例
假设有一个Python
脚本 example.py:
import csv
import requests
from bs4 import BeautifulSoupdef greet(name):print("Hello, {}!".format(name))def main():# 检查命令行参数数量if len(sys.argv) < 2:print("Usage: python script.py <name>")sys.exit(1) # 退出程序,返回错误码1# 获取命令行参数中的名字name = sys.argv[1]# 调用greet函数greet(name)def amazon():# 目标URLurl = 'https://www.shanghairanking.cn/rankings/bcur/2024'# 请求头,模拟浏览器行为,防止被服务器识别为爬虫。headers = {'Connection': 'keep-alive','Cache-Control': 'no-store, no-cache, must-revalidate','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36','Accept': '*/*','Accept-Encoding': 'gzip, deflate, br, zstd','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Referer': 'https://www.shanghairanking.cn/rankings/bcur/2024',}# 创建一个会话对象,保持连接session = requests.session()# 先访问一次首页,模拟用户行为session.get('https://www.shanghairanking.cn')# 发送带有headers的GET请求并获取响应内容resHtml = session.get(url, headers=headers).content.decode('utf-8')# 使用BeautifulSoup解析HTML内容html_soup = BeautifulSoup(resHtml, 'html.parser')# 查找表格中的所有行all_goods_li = html_soup.find('table').find_all('tr')# 打开CSV文件准备写入with open('output.csv', 'wb') as csvfile:# 创建一个csv.writer对象csv_writer = csv.writer(csvfile)for row in all_goods_li:goods_info_list = []rank = row.find('div', class_="ranking")img_link = row.find('img')['src']name = row.find('span', class_='name-cn')tags = row.find('p', class_="tags")if name and img_link:goods_info_list.append(rank.get_text(strip=True).encode('utf-8'))goods_info_list.append(img_link)# 将name添加到列表中,并转换为UTF-8编码goods_info_list.append(name.get_text(strip=True).encode('utf-8'))goods_info_list.append(tags.get_text(strip=True).encode('utf-8'))csv_writer.writerow(goods_info_list)# 如果此脚本被直接运行,则执行amazon函数
if __name__ == '__main__':main()
如果你直接运行这个脚本:
python example.py world
控制台会输出:Hello, World!
作为模块导入如果你在另一个脚本中导入 example.py:
import example
example.greet("Alice")example.amazon()
则输出Hello, Alice!
并执行amazon脚本。example.py 中的 if __name__ == '__main__'
: 块中的代码不会被执行,因为 example.py 是作为模块被导入的,其 __name__
的值为 'example'
,而不是 '__main__'
。
注意事项
- 命令行参数:确保在运行脚本时提供了正确的命令行参数。
- 编码问题:确保使用正确的编码处理非ASCII字符。
- 错误处理:可以添加异常处理逻辑来捕获并处理可能出现的错误。