第一章:huggingface整体介绍

前言

Hugging Face是一家专注于自然语言处理(NLP)和对话系统的创新型公司。它成立于2016年,总部位于纽约,由两位热衷于开源的机器学习工程师Clément Delangue和Julien Chaumond创立。Hugging Face的使命是推动NLP技术,让更多人能够轻松地访问和使用先进的语言模型。 Hugging Face的主要产品包括Transformers库、Datasets库、Tokenizers库以及Hugging Face Hub等。这些工具和平台为开发者和研究人员提供了一个全面、强大的NLP生态系统,帮助他们构建、部署和共享各种自然语言处理应用。也正是如此,很多大模型均会使用huggingface来构建,能为开发人员减少不必要工作量,如加速deepspeed、vit与llama等模型集成、高效微调PEFT(LoRA)等,也是我花费一定精力构建huggingface教程初衷。当然,我的教程不再文字上面内容解读,更多是源码内容解读,以为学习者二次开发,特别是想开发大模型相关的开发者。本篇文章简单介绍Huggingface!


一、 Hugging Face简介

Hugging Face是一家专注于自然语言处理(NLP)和对话系统的创新型公司。它成立于2016年,总部位于纽约,由两位热衷于开源的机器学习工程师Clément Delangue和Julien Chaumond创立。Hugging Face的使命是推动NLP技术,让更多人能够轻松地访问和使用先进的语言模型。 Hugging Face的主要产品包括Transformers库、Datasets库、Tokenizers库以及Hugging Face Hub等。这些工具和平台为开发者和研究人员提供了一个全面、强大的NLP生态系统,帮助他们构建、部署和共享各种自然语言处理应用。

在这里插入图片描述

二、 Hugging Face的生态系统

Hugging Face的生态系统由几个重要的组件组成,包括Transformers库、Datasets库、Tokenizers库和Hugging Face Hub等。这些组件相互协作,为开发者提供了一个完整的NLP工具链。

1. Transformers库

Transformers库是Hugging Face公司最著名的产品,它是一个开源的Python库,专注于为NLP任务提供高度可配置和易于使用的神经网络模型。Transformers库支持多种预训练模型,如BERT、GPT、RoBERTa、XLNet等,并提供了一致的API来加载、微调和使用这些模型。

Transformers库的主要特点包括:

  预训练模型:Transformers库提供了多种经过预训练的模型,特别是语言模型,覆盖了广泛的NLP任务,如文本分类、问答、命名实体识别、文本生成等。开发者可以直接使用这些预训练模型,或进一步微调它们以适应特定的应用场景。

  易用性: Transformers库提供了一致的API,使得开发者可以轻松地加载、微调和使用这些预训练模型,大大降低了NLP相关应用开发的复杂度。

  多任务支持: Transformers库支持多种NLP任务,使得开发者可以在单一框架内完成不同的自然语言处理需求。 多语言支持: Transformers库支持多种自然语言,包括英语、中文、德语、法语等,为跨语言应用的开发提供了便利。

  模型压缩: Transformers库提供了模型压缩功能,可以减小模型大小而不损失性能,从而更好地支持边缘设备和移动端的部署。

2.Datasets库

Datasets库是Hugging Face提供的另一个重要组件,它是一个开源的Python库,旨在为NLP任务提供高质量、易用的数据集。Datasets库拥有大量内置的数据集,涵盖了文本分类、问答、机器翻译等常见的NLP任务。同时,它还提供了一个简单易用的API,使开发者可以轻松地加载、处理和操作这些数据集。

Datasets库的主要特点包括:

  丰富的数据集: Datasets库内置了数百个高质量的NLP数据集,包括常见的基准数据集和一些较为罕见的数据集。开发者可以轻松地浏览和使用这些数据集。

  易用的API: Datasets库提供了一致的API,使开发者可以快速地加载、预处理和操作数据集,大大简化了NLP应用开发的前期准备工作。

  数据集管理: Datasets库提供了数据集版本管理、缓存和重用等功能,帮助开发者更好地管理和共享数据资源。

  自定义数据集: Datasets库支持开发者创建和上传自定义的数据集,并在Hugging Face Hub上与社区共享。

  多语言支持: Datasets库支持多种自然语言,为跨语言NLP应用的开发提供了便利。

3. Tokenizers库

Tokenizers库是Hugging Face提供的另一个重要组件,它是一个开源的Python库,专注于为NLP任务提供高性能、可定制的文本分词器(Tokenizer),可参考博客介绍这里。Tokenizers库支持多种分词算法,如WordPiece、BPE、SentencePiece等,并提供了一致的API来使用这些分词器。

Tokenizers库的主要特点包括:

  高性能: Tokenizers库采用Rust语言实现,具有极高的处理速度和并行化能力,大大提升了NLP应用的运行效率。

  可定制性: Tokenizers库支持多种分词算法,并提供了丰富的参数配置选项,使开发者可以根据不同的应用需求定制自己的Tokenizer。

  与Transformers的集成: Tokenizers库与Transformers库无缝集成,可以直接用于Transformers模型的输入和输出处理,大大简化了NLP应用的开发过程。

  多语言支持: Tokenizers库支持多种自然语言,为跨语言NLP应用的开发提供了便利。

  社区支持: Tokenizers库拥有活跃的开源社区,开发者可以从中获得丰富的技术支持和最佳实践。

Hub

Hugging Face Hub是Hugging Face公司提供的一个在线平台,它是Hugging Face生态系统中的一个重要组成部分。Hub旨在成为NLP模型和数据集的中心枢纽,为开发者和研究人员提供以下功能:

  模型共享和部署: Hub允许开发者在平台上共享和发布自己训练的NLP模型,并提供了简单易用的部署工具,使模型可以被广泛使用。

  模型评估和比较: Hub为开发者提供了一个统一的模型评估和比较平台,使用户可以轻松地评估和比较不同模型在各种NLP任务上的性能。

  社区参与和贡献: Hub鼓励开发者和研究人员参与到NLP模型和数据集的贡献和讨论中来,促进整个NLP生态系统的发展。

  模型追踪和版本管理: Hub提供了模型版本管理和追踪功能,使开发者可以更好地管理和迭代自己的NLP模型。

  跨平台部署: Hub支持将NLP模型部署到多种平台和环境中,包括云服务、边缘设备等,为开发者提供了更灵活的部署选择。

总的来说,Hugging Face的生态系统为NLP应用开发提供了一个全面、强大的工具链,使开发者能够更高效地构建、部署和共享各种自然语言处理应用。接下来,我们将分别深入探讨这些组件的具体使用方法。

三、Transformers库的使用

1. 安装和导入

要使用Transformers库,首先需要安装它。可以使用pip命令进行安装:

pip install transformers

安装完成后,我们可以在Python代码中导入Transformers库:

from transformers import AutoTokenizer, AutoModel

这里我们导入了两个关键类:AutoTokenizer和AutoModel。AutoTokenizer用于加载预训练的分词器,AutoModel用于加载预训练的语言模型。

2. 预训练模型的加载和使用

Transformers库提供了大量预训练的语言模型,开发者可以直接加载并使用这些模型。以BERT模型为例,我们可以使用以下代码加载并使用它:

# 加载BERT预训练模型和分词器 
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased') 
model = AutoModel.from_pretrained('bert-base-uncased')  
# 对输入文本进行编码 
text = "This is a sample text for demonstrating Transformers." encoded_input = tokenizer(text, return_tensors='pt')  
# 使用BERT模型进行前向传播 
output = model(**encoded_input)  
# 访问模型输出 
print(output.last_hidden_state.shape)  
# torch.Size([1, 12, 768])

在这个示例中,我们首先使用AutoTokenizer.from_pretrained()加载了BERT的预训练分词器,然后使用AutoModel.from_pretrained()加载了BERT的预训练模型。之后,我们将输入文本编码为Transformers模型能够接受的格式,并将其传入模型进行前向传播。最后,我们可以访问模型的输出,如最后一层的隐藏状态。

3. 微调预训练模型

尽管预训练模型已经具有强大的能力,但在某些特定任务上可能还需要进一步的微调。Transformers库提供了便捷的微调接口,使开发者可以轻松地在预训练模型的基础上进行微调。 以文本分类任务为例,我们可以使用以下代码进行模型微调:

from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer  
# 加载预训练模型和分词器 
model = AutoModelForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2) 
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')  
# 准备训练数据 
train_dataset = load_dataset('glue', 'sst2', split='train') eval_dataset = load_dataset('glue', 'sst2', split='validation')  
# 定义训练参数 
training_args = TrainingArguments(
	output_dir='./results',     
	evaluation_strategy='epoch',     
	learning_rate=2e-5,     
	per_device_train_batch_size=16,     
	per_device_eval_batch_size=16,     
	num_train_epochs=3,     
	weight_decay=0.01, 
)  
# 创建Trainer对象并进行训练 
trainer = Trainer(     
	model=model,     
	args=training_args,     
	train_dataset=train_dataset,     
	eval_dataset=eval_dataset,     
	tokenizer=tokenizer, 
)  
trainer.train()

在这个示例中,我们首先加载了预训练的BERT模型和分词器,然后使用Hugging Face提供的内置数据集glue/sst2作为训练和验证数据集。接下来,我们定义了训练参数,包括学习率、批量大小、训练轮数等。最后,我们创建了一个Trainer对象,并调用train()方法开始模型的微调过程。

4. 生成文本

除了对输入文本进行编码和分类,Transformers库还支持生成文本的功能。这一功能主要依赖于预训练的语言生成模型,如GPT-2、GPT-Neo、CTRL等。

以使用GPT-2生成文本为例,我们可以使用以下代码:

from transformers import GPT2LMHeadModel, GPT2Tokenizer  
# 加载GPT-2预训练模型和分词器 
model = GPT2LMHeadModel.from_pretrained('gpt2') 
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')  
# 设置生成参数 
prompt = "The quick brown fox" 
max_length = 50 
num_return_sequences = 3 
top_k = 50 
top_p = 0.95 
do_sample = True  
# 生成文本 
input_ids = tokenizer.encode(prompt, return_tensors='pt') 
output_ids = model.generate(     
input_ids,     
max_length=max_length,     
num_return_sequences=num_return_sequences,     
top_k=top_k,     
top_p=top_p,     
do_sample=do_sample )  
# 解码生成的文本 
generated_texts = [tokenizer.decode(output_id, skip_special_tokens=True) 
for output_id in output_ids] for text in generated_texts:     
	print(text)

在这个示例中,我们首先加载了预训练的GPT-2模型和分词器。然后,我们设置了一些生成参数,如最大长度、生成序列数量、采样策略等。接下来,我们将提示词编码为模型可接受的输入格式,并使用model.generate()方法生成文本。最后,我们将生成的输出ID解码为可读的文本,并打印出结果。

通过这些示例,我们可以看到Transformers库为NLP应用的开发提供了强大而灵活的工具。接下来,我们将探讨Hugging Face的另一个重要组件 - Datasets库。

四、Datasets库的使用

Datasets库为NLP开发者提供了一个高质量、易用的数据集管理工具。无论是使用内置的数据集,还是创建自定义数据集,Datasets库都能为您提供帮助。

1.加载内置数据集

Datasets库内置了大量常用的NLP数据集,开发者可以轻松地加载和使用它们。以GLUE数据集为例,我们可以使用以下代码进行加载:

from datasets import load_dataset  
# 加载GLUE数据集的SST-2任务 
dataset = load_dataset("glue", "sst2")  
# 查看数据集信息 
print(dataset) 
# DatasetDict({ 
#     train: Dataset(features: ['sentence', 'label'], num_rows: 67349) 
#     validation: Dataset(features: ['sentence', 'label'], num_rows: 872) 
#     test: Dataset(features: ['sentence', 'label'], num_rows: 1821) 
# })  
# 访问数据集samples 
print(dataset['train'][0]) 
# {'sentence': 'A masterpiece of black comedy, coulding ranks with the best satire of the 20th century.', 'label': 1}

在这个示例中,我们使用load_dataset()函数加载了GLUE数据集的SST-2任务。该函数会返回一个DatasetDict对象,其中包含训练集、验证集和测试集。我们可以通过字典键访问这些子数据集,并查看数据集的详细信息。

2. 创建自定义数据集

除了使用内置数据集,Datasets库也支持开发者创建和上传自定义数据集。下面是一个示例,演示如何创建一个简单的文本分类数据集:

from datasets import Dataset  
# 创建样本数据 
data = [     {"text": "This is a positive review.", "label": 1},     {"text": "The product is terrible.", "label": 0},     {"text": "I had a great experience.", "label": 1},     {"text": "Disappointing quality.", "label": 0} ]  
# 创建Dataset对象 
dataset = Dataset.from_list(data)  
# 查看数据集信息 
print(dataset) 
# Dataset(features={'text': Value(dtype='string', id=None), 'label': Value(dtype='int64', id=None)}, num_rows=4)  
# 访问数据集samples print(dataset[0]) 
# {'text': 'This is a positive review.', 'label': 1}

在这个示例中,我们首先定义了一些样本数据,包含文本和标签。然后,我们使用Dataset.from_list()方法创建了一个自定义的Dataset对象。最后,我们可以查看数据集的信息,并访问其中的样本数据。

3.数据集预处理

在使用Datasets库加载数据集后,通常需要对数据进行一些预处理操作,如文本清洗、特征提取等。Datasets库提供了丰富的预处理功能,使开发者能够轻松地完成这些任务。

以文本分类任务为例,我们可以使用以下代码对数据集进行预处理:

from transformers import AutoTokenizer  
# 加载GLUE数据集的SST-2任务 
dataset = load_dataset("glue", "sst2")  
# 加载BERT分词器 
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')  
# 定义数据预处理函数 
def preprocess_function(examples):     
	return tokenizer(examples['sentence'], padding='max_length', truncation=True, max_length=128)  
# 应用预处理函数到数据集 
processed_dataset = dataset.map(preprocess_function, batched=True)  
# 查看预处理后的数据样例 
print(processed_dataset['train'][0]) 
# {'input_ids': [101, 2023, 2003, 1037, 3403, 1012, 102], 'attention_mask': [1, 1, 1, 1, 1, 1, 1], 'label': 1}

在这个示例中,我们首先加载了GLUE数据集的SST-2任务,然后加载了BERT分词器。接下来,我们定义了一个数据预处理函数preprocess_function()。该函数使用BERT分词器对文本进行编码,包括添加特殊标记、填充和截断等操作。最后,我们使用map()方法将预处理函数应用到整个数据集,得到了一个新的预处理后的数据集processed_dataset。

通过Datasets库提供的预处理功能,开发者可以轻松地对数据集进行各种清洗和特征提取操作,为后续的模型训练和应用开发做好准备。

五、Tokenizers库的使用

Tokenizers库是Hugging Face生态系统中另一个重要的组件,它专注于为NLP任务提供高性能、可定制的文本分词器(Tokenizer)。

1. 了解Tokenizer

Tokenizer是NLP中一个关键的组件,它负责将输入文本分割为模型可理解的token序列。Tokenizers库支持多种分词算法,如WordPiece、BPE、SentencePiece等,并提供了一致的API来使用这些分词器。

以BERT的WordPiece分词器为例,我们可以使用以下代码进行初始化和使用:

from transformers import BertTokenizer  
# 初始化BERT分词器 
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')  
# 对输入文本进行编码 
text = "This is a sample text." encoded_input = tokenizer(text)  
# 查看编码结果 
print(encoded_input) 
# {'input_ids': [101, 2023, 2003, 1037, 3403, 1012, 102], 'attention_mask': [1, 1, 1, 1, 1, 1, 1]}

在这个示例中,我们首先初始化了BERT的WordPiece分词器。然后,我们使用tokenizer()方法对输入文本进行编码,得到了包含input_ids和attention_mask的字典。input_ids是分词后的token ID序列,attention_mask指示哪些token需要参与模型的计算。

2.自定义Tokenizer

除了使用预定义的分词器,Tokenizers库还支持开发者自定义分词器。这可以帮助开发者针对特定的应用场景和语言特点,创建更加适合的分词规则。

下面是一个自定义BPE分词器的示例:

from tokenizers import ByteLevelBPETokenizer  
# 创建BPE分词器 
tokenizer = ByteLevelBPETokenizer()  
# 训练分词器 
tokenizer.train(     files=['/path/to/corpus1.txt', '/path/to/corpus2.txt'],     vocab_size=30000,     min_frequency=2,     special_tokens=['[UNK]', '[CLS]', '[SEP]', '[PAD]', '[MASK]'] )  
# 保存分词器 
tokenizer.save_model('/path/to/tokenizer')  
# 使用分词器 
encoded_input = tokenizer.encode("This is a sample text.") 
print(encoded_input.ids) 
# [21845, 267, 28, 2320, 4199, 13]

在这个示例中,我们创建了一个BPE分词器,并使用给定的语料库对其进行训练。训练过程中,我们指定了词表大小、最小频率以及一些特殊标记符。训练完成后,我们将分词器保存到磁盘,并演示了如何使用它对输入文本进行编码。

3. Tokenizer与Transformers的结合

Tokenizers库与Transformers库紧密集成,使得开发者可以将自定义的Tokenizer无缝地应用于Transformers模型的输入和输出处理。

下面是一个示例,演示如何将自定义的Tokenizer与BERT模型结合使用:

from transformers import BertForSequenceClassification, BertConfig from tokenizers import ByteLevelBPETokenizer  
# 加载自定义Tokenizer 
tokenizer = ByteLevelBPETokenizer.from_pretrained('/path/to/tokenizer')  
# 创建BERT模型配置 
config = BertConfig(     
	vocab_size=tokenizer.get_vocab_size(),     
	max_position_embeddings=514,     
	num_attention_heads=12,     
	num_hidden_layers=6,     
	type_vocab_size=2 
)  
# 创建BERT模型 
model = BertForSequenceClassification(config)  
# 使用自定义Tokenizer对输入进行编码 
encoded_input = tokenizer.encode("This is a sample text.") 
model_input = {     
	'input_ids': encoded_input.ids,     
	'attention_mask': encoded_input.attention_mask 
}  
# 将输入传入BERT模型进行前向传播 
output = model(**model_input)

在这个示例中,我们首先加载了之前自定义训练的BPE分词器。然后,我们根据分词器的词表大小创建了一个BERT模型配置,并使用该配置初始化了一个BERT文本分类模型。最后,我们使用自定义的分词器对输入文本进行编码,并将编码结果传入BERT模型进行前向计算。 通过这种方式,开发者可以充分利用Tokenizers库提供的分词能力,并将其与Transformers库结合。

六、Hugging Face Hub的应用

Hugging Face Hub是Hugging Face生态系统中的一个重要组成部分,它为开发者和研究人员提供了一个集中的平台,用于管理、共享和部署NLP模型。

1.模型共享和部署

Hugging Face Hub允许开发者将自己训练的NLP模型上传到平台上,并提供了简单易用的部署工具,使得这些模型可以被其他用户轻松地调用和使用。这一功能对于促进NLP技术的发展和应用非常重要。

以将BERT文本分类模型部署到Hub为例,我们可以使用以下代码:

from transformers import pipeline  
# 加载预训练的BERT文本分类模型 
classifier = pipeline('text-classification', model='bert-base-uncased-finetuned-sst-2-english')  
# 保存模型到Hugging Face Hub 
classifier.save_pretrained('username/my-text-classifier')

在这个示例中,我们首先使用Transformers库提供的pipeline()函数加载了一个预训练的BERT文本分类模型。然后,我们调用模型的save_pretrained()方法,将其上传到Hugging Face Hub上。这个过程会自动处理模型文件的打包和上传,使得其他用户可以轻松地访问和下载该模型。

2. 模型评估和比较

Hugging Face Hub不仅提供了模型共享和部署的功能,还支持开发者对NLP模型进行评估和比较。这个功能对于选择最合适的模型非常有帮助。

以在Hub上评估GLUE基准测试为例,我们可以使用以下代码:

from transformers import pipeline  
# 加载GLUE评估任务管道 
eval_pipeline = pipeline('text-classification', model='distilbert-base-uncased-finetuned-sst-2-english')  
# 在GLUE SST-2验证集上进行评估 
eval_results = eval_pipeline.evaluate('glue', 'sst2') 
print(eval_results) 
# {'accuracy': 0.9112, 'f1': 0.9112, 'recall': 0.9112, 'precision': 0.9112}

在这个示例中,我们首先使用pipeline()函数加载了一个预训练的文本分类模型。然后,我们调用模型的evaluate()方法,传入GLUE评估任务的名称和数据集名称。这将自动在指定的数据集上进行评估,并返回包含准确率、F1值等指标的结果字典。

通过这种方式,开发者可以轻松地比较不同模型在标准数据集上的性能,并选择最合适的模型进行部署。

3. 社区参与和贡献

Hugging Face Hub不仅是一个模型管理和部署的平台,也是一个积极的开源社区。开发者可以在Hub上讨论、分享和贡献各种NLP资源,如预训练模型、数据集、教程等,从而推动整个NLP生态系统的发展。

例如,开发者可以在Hub上创建自己的模型仓库,并邀请其他人进行评论、测试和改进。同时,开发者也可以参与到已有模型的改进中来,为社区做出贡献。

总的来说,Hugging Face Hub为NLP开发者提供了一个全方位的支持平台,包括模型共享、部署、评估和社区参与等功能。这有助于加速NLP技术的普及和应用,为更多人带来便利。

七、 总结

Hugging Face是一家专注于NLP技术的创新公司,其生态系统包括Transformers库、Datasets库、Tokenizers库和Hugging Face Hub等重要组件。这些工具和平台为开发者和研究人员提供了一个强大、完整的NLP工具链,大大简化了NLP应用的开发过程。

通过本文的介绍,我们了解到:

Transformers库为NLP任务提供了大量预训练模型,并支持简单易用的加载、微调和使用接口。 Datasets库拥有丰富的内置数据集,同时也支持开发者自定义数据集,并提供了高效的数据预处理功能。

Tokenizers库专注于为NLP任务提供高性能、可定制的文本分词器,并可与Transformers库无缝集成。

Hugging Face Hub是一个集中的NLP模型和数据集管理平台,支持模型共享、部署、评估和社区参与等功能。

随着自然语言处理技术的快速发展,Hugging Face的生态系统必将在未来发挥越来越重要的作用。开发者和研究人员可以充分利用Hugging Face提供的工具和资源,在各种NLP应用的开发和部署中获得极大的便利。同时,通过参与Hugging Face社区,开发者也可以为NLP领域做出自己的贡献,助力整个生态系统的发展。

### 解决 `zsh: command not found: huggingface-cli` 方案 当遇到 `huggingface-cli: command not found` 错误时,这通常意味着系统的环境变量 PATH 中缺少指向该命令的位置。解决方案涉及确保 Python 软件包管理器已正确安装所需库,并使这些工具可全局访问。 #### 验证并安装依赖项 确认是否已经通过 pip 成功安装了 `huggingface_hub` 库。如果尚未完成此操作,则需先执行如下指令: ```bash pip install --upgrade pip setuptools wheel pip install huggingface_hub ``` 上述命令不仅会更新必要的构建工具至最新版本,还会下载并设置 Hugging Face Hub SDK 到本地环境中[^1]。 #### 设置环境变量 即使成功安装了所需的 Python 包,在某些情况下仍可能收到命令未找到的消息。这是因为默认情况下,Python 的脚本路径并未被加入到 shell 的搜索路径中。对于使用 Z Shell (ZSH) 的用户来说,可以编辑 `.zshrc` 文件来添加缺失的条目: 打开终端输入以下命令以编辑配置文件: ```bash nano ~/.zshrc ``` 接着向文件末尾追加一行指定 Python Scripts 目录: ```bash export PATH=$PATH:/path/to/python/scripts/folder ``` 这里的 `/path/to/python/scripts/folder` 是指实际存放 Python 可执行文件的地方,通常是类似于 `~/.local/bin/` 或者虚拟环境中对应的 scripts 文件夹位置。保存更改后记得重新加载配置使之生效: ```bash source ~/.zshrc ``` 此时再次尝试运行 `huggingface-cli login` 命令应该不会再报错了[^3]。 #### 使用 Virtual Environment (推荐) 为了更好地管理和隔离不同项目之间的依赖关系,建议创建独立的工作空间来进行开发工作。这样不仅可以避免权限问题还能减少潜在冲突的发生几率。以下是建立新虚拟环境的方法之一: ```bash python -m venv my_venv_name source my_venv_name/bin/activate pip install huggingface_hub ``` 激活后的虚拟环境下,默认会自动将当前使用的 Python 版本及其关联资源纳入 PATH 环境变量之中,从而简化外部调用过程中的复杂度[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangjunjun-owen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值