当前位置: 首页 > news >正文

【Python程序设计】Python 中的环境变量【05/8】

一、说明

以下文章是有关 Python 数据工程系列文章的一部分,旨在帮助数据工程师、数据科学家、数据分析师、机器学习工程师或其他刚接触 Python 的人掌握基础知识。本篇将讲述环境变量的问题。
        迄今为止,本初学者指南包括:
  • 第 1 部分:Python 包:数据人员入门(第 1 部分,共 2 部分),探讨了 Python 模块、Python 包的基础知识以及如何将模块导入您自己的项目。
  • 第 2 部分:Python 包:数据人员入门(第 2 部分,共 2 部分),介绍了依赖项管理和虚拟环境。
  • 第 3 部分:构建 Python 项目的最佳实践,涵盖了构建项目的 9 个最佳实践和示例。
  • 第 4 部分:从 Python 项目到 Dagster 管道,我们探讨了设置 Dagster 项目以及数据资产的关键概念。
  • 第 5 部分:环境变量 在 Python 中,我们将介绍环境变量的重要性以及如何使用它们。
  • 第 6 部分:类型提示,或类型提示如何减少错误。
  • 第 7 部分:工厂模式,或学习设计模式,它们是软件设计中常见问题的可重用解决方案。

注册我们的时事通讯以获取所有更新!


今天,我们将看看在 Python 中管理环境变量。环境变量提供了一种以非硬编码方式配置应用程序的方法,使您能够在不更改实际代码的情况下修改应用程序行为。

在生产环境中参数化数据管道时,环境变量的使用变得尤为重要。它们允许将数据库凭据或 API 密钥等敏感信息存储在代码库之外。这不仅增强了安全性,而且还使代码更具可移植性和更易于管理。

        在本文中,我们将揭开 Python 中环境变量概念的神秘面纱,解释它们是如何工作的,为什么它们很重要,以及如何有效地利用它们来增强你的 Python 编程技能。我们将引导您完成实际示例,介绍技术和最佳实践,使您能够设置 Python 环境、配置重要工具的路径或设置脚本所依赖的环境变量。

目录

  • 什么是环境变量?
  • 环境变量的范围和生命周期
  • 环境变量和配置
  • 管理环境变量的最佳实践

二、什么是环境变量?

        Python 提供了一个名为 os 的内置模块作为与底层操作系统交互的接口。此模块提供了一个类似字典的对象,允许您与环境变量进行交互。os.environ

  os.environ充当环境变量名称与其值之间的映射。它可以在 Python 程序中访问、修改或创建环境变量。让我们分解一下。

2.1 读取 Python 环境变量

        要在 Python 中读取环境变量的值,您需要将其视为字典并按其名称访问该变量。下面是一个示例:os.environ

import os# Accessing an environment variable
print(os.environ['HOME'])

        这将打印您的默认“主”目录:在 macOS 系统或 Linux 系统上:/Users/username/home/username

/Users/elliot

        此处是环境变量的名称,该变量通常存储当前用户主目录的路径。如果环境变量存在,其值将打印到控制台。但是,如果环境变量不存在,这将引发 .HOMEKeyError

        若要避免此错误,可以选择使用该方法,该方法允许您提供在找不到环境变量时将返回的默认值:get

import os# Accessing an environment variable with a default value
print(os.environ.get('HOME', '/home/default'))

        在这种情况下,如果变量不存在,则将返回字符串。HOME/home/default

        您可以使用以下脚本打印和浏览所有环境变量:

import osfor name, value in os.environ.items():print("{0}: {1}".format(name, value))

2.2 修改和添加环境变量

        您可以通过为对象中的键赋值来修改现有环境变量的值,也可以添加新环境变量:os.environ

import os# Setting an environment variable
os.environ['MY_VARIABLE'] = 'foo'# Now, the new variable is accessible via os.environ
print(os.environ['MY_VARIABLE'])  # Outputs: foo

        在这种情况下,将创建环境变量并将其设置为 。但是,只要当前进程正在运行,此变量就可用。MY_VARIABLE foo

        请记住,对对象所做的更改是进行更改的进程的本地更改。如果在 Python 脚本中设置环境变量,则该变量可用于该脚本及其创建的任何子进程,但在更广泛的环境或其他不相关的进程中不可见。os.environ

以这种方式设置的环境变量的范围和生命周期仅限于分配它们的当前进程。由于这可能是一个复杂的问题,请考虑我们上面的例子。

我们的 Python 脚本设置了一个名为 的环境变量。假设我们调用另一个 Python 脚本并创建一个子进程(进程 1)。第二个脚本也将能够访问 。但是,如果您尝试从第一个脚本(进程 2)未启动的其他 Python 脚本或在运行脚本后从命令行访问,您会发现该脚本不可用 - 它不是更广泛环境的一部分。但是,这两个进程都可以访问任何全局变量,如上例所示。MY_VARIABLEfooMY_VARIABLEMY_VARIABLEMY_VARIABLEGLOBAL_VARIABLE

三、环境变量的范围和生命周期

要跨不同的会话或进程持久化环境变量,您需要在 Python 之外的操作系统环境中设置它们。执行此操作的方法因操作系统和 shell 而异,但通常涉及编辑 shell 配置文件或使用命令行实用程序。

让我们回顾一下我们谈论操作系统、shell 和命令行实用程序时的意思。

3.1 操作系统、外壳和命令行实用程序

        操作系统是在计算机上运行的最基本的软件。它充当用户和计算机硬件之间的中介,使用户能够执行程序、管理文件以及与设备交互。操作系统允许您管理文件、进程、内存和安全性。流行的操作系统包括Microsoft Windows,macOS和Linux发行版(如Ubuntu,Fedora等)。

        外壳允许您与计算机的操作系统进行交互。作为数据工程师,您将主要使用命令行 shell,它允许您通过将命令作为文本键入来向操作系统发出命令。

        当您打开终端窗口(在 Linux 或 Mac 上)或命令提示符(在 Windows 上)时,您将与 shell 进行交互。您可以键入一个命令,例如运行 Python 脚本,或者(在 Linux 或 Mac 上)或(在 Windows 上)列出当前目录中的文件。这些都是与命令行外壳交互的示例。python my_script.py ls dir

        外壳配置文件是外壳在启动时读取的特殊文件。作为数据工程师,您可能会使用它们来设置每次打开新终端窗口时应该可用的环境变量。这使得它更容易,因为 shell 每次启动时都会自动执行。

        命令行实用程序是设计为从文本界面使用的程序。无需单击按钮,您可以从命令行运行 Python 脚本(例如,使用 pip 安装 Python 包或使用 jupyter 启动 Jupyter 笔记本服务器)或从命令行使用 Git 进行版本控制。其他例子包括Unix命令行实用程序,如grep,awk,sed,用于搜索,过滤和转换文本数据;curl 和 wget 从网络下载文件;和 ssh 以在使用分布式系统或基于云的资源时与远程服务器连接。

3.2 进程级范围

在 Python 脚本中设置或修改的环境变量可以在同一进程中访问。如果脚本启动另一个进程(称为子进程),则该子进程将继承其父进程的环境,包括父进程设置的任何环境变量。但是,如果两个单独的进程都设置了一个同名的环境变量,它们就不会相互干扰;每个进程都有自己独立的环境副本。os.environ

3.3 用户级和系统级范围:

        如果要设置特定用户的所有进程或系统上的所有进程都可以访问的环境变量,则需要在 Python 之外的 shell 或操作系统的配置文件中执行此操作。这些变化的范围更广,但不是立竿见影的;它们通常要求您启动新的 shell 会话或重新启动系统。

3.4 更改的持久性

        在脚本完成执行后,不会保留在 Python 脚本中使用的环境变量所做的更改。这意味着,如果您运行设置环境变量的脚本,然后运行另一个脚本或返回到 shell,则与第一个脚本相比的环境变量更改将不可见。os.environ

        这种非持久性实际上可能是一个优势。它允许您的脚本根据需要修改其环境以实现其自身目的,而不会影响其他进程或留下可能影响未来 shell 会话的持久更改。

        如果要设置在多个 shell 会话中持续存在或可供其他应用程序使用的环境变量,则必须在 shell 级别或通过操作系统的接口设置环境变量。执行此操作的确切方法取决于您的操作系统和 shell。但是,这应该小心完成,因为它可能会对系统的行为产生广泛的影响。

四、环境变量和配置

        利用环境变量进行配置被认为是软件开发中的最佳实践,原因有两个。

        首先,它们允许您避免直接在代码中存储敏感信息,如密码、API 密钥或数据库 URI。这可以防止此类信息无意中暴露,例如,通过包含在版本控制存储库中。

        其次,它们还使您的代码更具可移植性。当开发、测试和生产环境需要不同的设置时,可以通过环境变量控制这些设置,而无需修改代码。如果需要更改配置值,可以在环境变量中更新该值,而无需更改应用程序的代码,也无需重新部署应用程序。

4.1 对敏感信息使用环境变量

        要将环境变量用于敏感数据(如 API 密钥或数据库 URI),只需确保在运行 Python 代码的环境中设置相关的环境变量。

        例如,您可能有一个连接到数据库并使用 API 的 Python 脚本。您可以使用环境变量,而不是在脚本中硬编码数据库 URI 和 API 密钥:

import os# Accessing sensitive data from environment variables
db_uri = os.environ.get('DATABASE_URI')
api_key = os.environ.get('API_KEY')

        在这种情况下,需要在运行脚本的环境中设置 and 环境变量。这可以在启动脚本之前在 shell 中完成,也可以在 shell 启动时读取的配置文件中完成。DATABASE_URIAPI_KEY

4.2 不要硬编码!

        在代码中硬编码敏感信息(即直接将特定值或参数直接嵌入代码中),例如 API 密钥或数据库 URI,这是一个重大的安全风险。如果您的代码是共享或公开的,例如,在 GitHub 上,任何可以看到代码的人都可以看到这些敏感详细信息。这可能允许未经授权访问您的数据库或滥用您的 API 密钥。

        即使您不打算共享代码,仍然存在风险。硬编码信息保留在版本控制历史记录中,因此以后访问存储库的任何人都可以在旧提交中找到敏感数据。

        硬编码还会降低代码的灵活性。如果要使用其他数据库进行测试或需要更改 API 密钥,则需要更改并重新部署代码。相比之下,如果您使用环境变量来获取此类详细信息,则可以在需要时简单地更改环境变量,而无需接触代码。

五、管理环境变量的最佳做法

        使用所谓的“dotenv”文件,您可以将配置存储在应用程序启动时加载的文件中。该库提供了一种将环境变量加载到 Python 中的对象中的方法。以下是使用它的方法:.envpython-dotenv.env filesos.environ

        如果您尚未安装该库,请安装该库。您可以通过 pip:python-dotenv 安装它

pip install python-dotenv

        在项目根目录中创建一个文件并向其中添加一些变量。该文件可能看起来像这样:.env

DATABASE_URI=postgres://myuser:mypassword@localhost:5432/mydatabase
API_KEY=abcdef123456

        注意:不应将此文件提交到您的版本控制系统。您应该添加到您的文件中以确保 Git 忽略它..env.gitignore

        在 Python 脚本中,您可以使用以下命令加载文件:python-dotenv.env

from dotenv import load_dotenv# Load the .env file
load_dotenv()# Now you can access the variables
import os
db_uri = os.getenv('DATABASE_URI')
api_key = os.getenv('API_KEY')

该函数读取文件并将其内容加载到 .load_dotenv().envos.environ

5.1 生产中的环境变量

        在开发中,使用一种简单而安全的方式来设置应用程序可以使用的环境变量通常是有益的。根据您的特定生产环境,这可能看起来非常不同。

        您可以利用特定服务来管理云环境中的机密:

  • 亚马逊云科技 (AWS) 密钥管理器或参数存储
  • Azure Key Vault
  • 谷歌云秘密管理器

        您还可以在容器编排系统中使用特定的机密管理对象:

  • Kubernetes Secrets或与HashiCorp Vault等工具的集成
  • 码头工人的秘密

        我们将看到这在 Amazon Elastic Container Service (Amazon ECS) 和 Kubernetes 中是如何工作的。

5.2 Amazon ECS 任务定义和 AWS Secrets Manager

        您可以直接在任务定义中定义环境变量。下面是一个 JSON 格式的示例:

{"containerDefinitions": [{"name": "my-container","image": "my-image","environment": [{"name": "ENV_VARIABLE_NAME","value": "value"}]}]
}

对于敏感数据,您可以将密钥存储在 AWS 密钥管理器中,并在任务定义中引用它们:

{"containerDefinitions": [{"name": "my-container","image": "my-image","secrets": [{"name": "DB_PASSWORD","valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name"}]}]
}

5.3 Kubernetes ConfigMaps

        在 Kubernetes 中,您可以使用非敏感数据的 ConfigMaps 和敏感数据的 Secrets 来管理环境变量。

        下面是使用 ConfigMap 定义环境变量的示例。首先,在 yaml 文件中创建一个配置映射:

apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:ENV_VARIABLE_NAME: value

然后,在 Pod 中引用配置映射:

apiVersion: v1
kind: Pod
metadata:name: my-app
spec:containers:- name: my-containerimage: my-imageenvFrom:- configMapRef:name: app-config

或者,您可以将 Kubernetes Secrets 用于敏感数据。首先,使用您的密钥创建一个 bash 文件:

kubectl create secret generic app-secrets --from-literal=DB_PASSWORD=secretpassword

然后,在 Pod 中引用密钥:

apiVersion: v1
kind: Pod
metadata:name: my-app
spec:containers:- name: my-containerimage: my-imageenv:- name: DB_PASSWORDvalueFrom:secretKeyRef:name: app-secretskey: DB_PASSWORD

5.4 何时使用环境变量

        环境变量最适合用于因部署环境而异的配置数据以及不应直接存储在代码中的敏感数据。

        应考虑将环境变量用于:
  • 数据库 URL 和其他相关设置
  • API 密钥、令牌或机密
  • 外部服务的主机名或 URL
  • 不应在代码中公开的任何类型的敏感数据
        但是,环境变量可能不是以下情况的最佳选择:
  • 可能需要经常更改的微调配置选项
  • 大量二进制数据
  • 最好存储在数据库或其他存储服务中的数据

5.5 管理机密和敏感信息的其他注意事项

        管理机密和敏感信息是环境变量的主要用途之一。通过将此数据存储在环境变量中,可以将其排除在代码之外。这可以防止机密在版本控制系统中公开,并允许您在不修改代码的情况下更改机密。

        但是,仅使用环境变量不足以保证机密安全。您还应该:

  • 避免记录环境变量,因为不应看到机密的人员通常可以访问日志。
  • 请注意可能暴露环境变量的错误消息。
  • 确保版本控制系统忽略您的文件。.env

5.6 环境变量促进一致性

        保持开发和生产环境的一致性有助于防止代码在不同环境中行为不同时出现的错误。环境变量可以帮助解决这个问题。

        通过将环境变量用于因环境而异的配置,可以确保代码本身在所有环境中保持一致。只有环境变量中的设置会更改。

        这意味着只需设置适当的环境变量,即可在开发、测试或生产环境中运行代码。如果您的代码在一个环境中工作,则更有可能在其他环境中工作。

        但是,这需要纪律。您应该抵制对配置数据进行硬编码的诱惑,而是始终使用环境变量。此外,团队的所有成员都应了解如何在其开发环境中设置和使用环境变量。这可以通过使用python-dotenv等工具来实现,这些工具简化了管理环境变量的过程。

六、结论

        我们已经了解了使用环境变量如何帮助更安全地管理生产应用程序,并参数化数据工程管道。如果您有任何问题或需要进一步澄清,感谢您的阅读!

相关文章:

【Python程序设计】Python 中的环境变量【05/8】

一、说明 以下文章是有关 Python 数据工程系列文章的一部分,旨在帮助数据工程师、数据科学家、数据分析师、机器学习工程师或其他刚接触 Python 的人掌握基础知识。本篇将讲述环境变量的问题。 迄今为止,本初学者指南包括: 第 1 部分&#xf…...

查漏补缺 - ES6

目录 1,let 和 const1,会产生块级作用域。2,如何理解 const 定义的变量不可被修改? 2,数组3,对象1,Object.is()2,属性描述符3,常用API4,得到除某个属性之外的新对象。 4…...

基于视觉重定位的室内AR导航APP的大创项目思路(1):最初的项目思路(SLAM)

文章目录 最初的项目思路(SLAM):后文: 前情提要: 是第一次做项目的小白,文章内的资料介绍如有错误,请多包含! 最初的项目思路(SLAM): 由于我们在…...

C 编译原理

C 编译原理 目录 C 编译原理引入GCC 工具链介绍C运行库 编译准备工作编译过程1.预处理2.编译3.汇编4.链接 分析ELF文件1.ELF文件的段2.反汇编ELF C语言编译过程 - 摘录编译预处理编译、优化汇编链接过程 引入 大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高…...

服务管理工具systemctl

服务管理工具systemctl Linux服务管理两种方式 service 和 systemctl systemd 是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动. systemd 对应的进程管理命令是systemctlsystemctl 是systemd的主命令,用于管理系统…...

Spring boot环境搭建

使用IDE工具:IntelliJ IDEA 目录 一、安装JAVA 二、安装maven(Java项目管理工具) 三、安装IDE 四、在IDE中配置spring boot项目环境 1、配置jdk 2、配置maven 3、安装创建spring boot项目插件:Spring Assistant 4、安装简…...

【C++】list的模拟实现【完整理解版】

目录 一、list的概念引入 1、vector与list的对比 2、关于struct和class的使用 3、list的迭代器失效问题 二、list的模拟实现 1、list三个基本函数类 2、list的结点类的实现 3、list的迭代器类的实现 3.1 基本框架 3.2构造函数 3.3 operator* 3.4 operator-> 3…...

Linux C++ OpenVINO 物体检测 Demo

目录 main.cpp #include <iostream> #include <string> #include <vector> #include <openvino/openvino.hpp> #include <opencv2/opencv.hpp> #include <dirent.h> #include <stdio.h> #include <time.h> #include …...

解决运行Docker镜像报错:version `GLIBC_2.32‘ not found

解决运行Docker镜像&#xff0c;报错&#xff1a;version GLIBC_2.32’ not found 详细报错日志 xapi-backend % docker logs 036de55b5bc6 ./xapi-backend: /lib/aarch64-linux-gnu/libc.so.6: version GLIBC_2.32 not found (required by ./xapi-backend) ./xapi-backend: …...

网络层--IP协议

引入&#xff1a; IP协议主要解决什么问题呢&#xff1f; IP协议提供一种将数据从主机&#xff21; 发送到 主机&#xff22;的能力。&#xff08;有能力不一定能做到&#xff0c;比如小明很聪明&#xff0c;可以考100分&#xff0c;但是他也不是每次搜能考100分&#xff0…...

Vue2 | Vant uploader实现上传文件和图片

需求&#xff1a; 实现图片和文件的上传&#xff0c;单个图片超过1M则压缩&#xff0c;全部文件加起来不得超过10M。 效果&#xff1a; 1. html <van-form ref"form"><van-field name"uploader" label"佐证材料" required><t…...

第二十一章 Classes

文章目录 第二十一章 ClassesClasses类名和包类定义的基本内容 第二十一章 Classes Classes 类定义并不是 ObjectScript 的正式组成部分。相反&#xff0c;可以在类定义的特定部分中使用 ObjectScript&#xff08;特别是在方法定义中&#xff0c;可以在其中使用其他实现语言&…...

Ubuntu不能上网解决办法

问题及现象 Ubuntu的虚拟机&#xff08;18.04&#xff09;总是莫名就不能上网了。 使用ifconfig -a 查看&#xff0c;ensxx&#xff08;xx为虚拟机分配的id号&#xff09;对应的网卡有mac地址&#xff0c;但是没有分配ip地址。 Network中也没有Wired的选项。 临时解决方案 使…...

百度飞浆OCR识别表格入门python实践

1. 百度飞桨&#xff08;PaddlePaddle&#xff09; 百度飞桨&#xff08;PaddlePaddle&#xff09;是百度推出的一款深度学习平台&#xff0c;旨在为开发者提供强大的深度学习框架和工具。飞桨提供了包括OCR&#xff08;光学字符识别&#xff09;在内的多种功能&#xff0c;可…...

直接插入排序、希尔排序详解。及性能比较

直接插入排序、希尔排序详解。及性能比较 一、 直接插入排序1.1 插入排序原理1.2 代码实现1.3 直接插入排序特点总结 二、希尔排序 ( 缩小增量排序 )2.1 希尔排序原理2.2 代码实现2.3 希尔排序特点总结 三、直接插入排序和希尔排序性能大比拼 !!!3.1 如何对比性能&#xff1f;准…...

2023备战秋招Java面试八股文合集

Java就业大环境仍然根基稳定&#xff0c;市场上有很多机会&#xff0c;技术好的人前景就好&#xff0c;就看你有多大本事了。小编得到了一份很不错的资源&#xff0c;建议大家可以认真地来看看以下的资料&#xff0c;来提升一下自己的核心竞争力&#xff0c;在面试中轻松应对面…...

SLAM中的二进制词袋生成过程和工作原理

长期视觉SLAM (Simultaneous Localization and Mapping)最重要的要求之一是鲁棒的位置识别。经过一段探索期后&#xff0c;当长时间未观测到的区域重新观测时&#xff0c;标准匹配算法失效。 当它们被健壮地检测到时&#xff0c;回环检测提供正确的数据关联以获得一致的地图。…...

算法训练第五十九天

503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> nums1(nums.begin(), nums.end());nums.insert(nums.end(), nums1.beg…...

二叉树oj题

目录 层序遍历(一) 题目 思路 代码 层序遍历(二) 题目 思路 代码 根据二叉树创建字符串 题目 思路 代码 二叉树的最近公共祖先 题目 思路 代码 暴力版 队列版 栈版 bs树和双向链表 题目 思路 代码 前序中序序列构建二叉树 题目 思路 代码 中序后序…...

华为数通方向HCIP-DataCom H12-831题库(单选题:1-20)

第1题 关于IPSG下列说法错误的是? A、IPSG可以防范IP地址欺骗攻击 B、IPSG是一种基于三层接口的源IP地址过滤技术 C、IPSG可以开启IP报文检查告警功能,联动网管进行告警 D、可以通过IPSG防止主机私自更改IP地址 答案: B 解析: IPSG(入侵防护系统)并不是基于三层接口的源I…...

TableConvert-免费在线表格转工具 让表格转换变得更容易

在线表格转工具TableConvert TableConvert 是一个基于web的免费且强大在线表格转换工具&#xff0c;它可以在 Excel、CSV、LaTeX 表格、HTML、JSON 数组、insert SQL、Markdown 表格 和 MediaWiki 表格等之间进行互相转换&#xff0c;也可以通过在线表格编辑器轻松的创建和生成…...

伦敦金实时行情中的震荡

不知道各位伦敦金投资者&#xff0c;曾经花过多长的时间来观察行情走势的表现&#xff0c;不知道大家是否有统计过&#xff0c;其实行情有60%-70%的时间&#xff0c;都会处于没有明显方向的震荡行情之中呢&#xff1f;面对长期的震荡行情&#xff0c;伦敦金投资者道理应该如何应…...

蓝桥杯打卡Day7

文章目录 阶乘的末尾0整除问题 一、阶乘的末尾0IO链接 本题思路&#xff1a;由于本题需要求阶乘的末尾0&#xff0c;由于我们知道2*510可以得到一个0&#xff0c;那么我们就可以找出2的数和5的数&#xff0c;但是由于是阶乘&#xff0c;所以5的数量肯定是小于2的数量&#xf…...

Mobile Vision Transformer-based Visual Object Tracking

论文作者&#xff1a;Goutam Yelluru Gopal,Maria A. Amer 作者单位&#xff1a;Concordia University 论文链接&#xff1a;https://arxiv.org/pdf/2309.05829v1.pdf 项目链接&#xff1a;https://github.com/goutamyg/MVT 内容简介&#xff1a; 1&#xff09;方向&#…...

HTTP反爬困境

尊敬的程序员朋友们&#xff0c;大家好&#xff01;今天我要和您分享一篇关于解决反爬困境的文章。在网络爬虫的时代&#xff0c;许多网站采取了反爬措施来保护自己的数据资源。然而&#xff0c;作为程序员&#xff0c;我们有着聪明才智和技术能力&#xff0c;可以应对这些困境…...

从零开始探索C语言(九)----函数指针与回调函数

函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量&#xff0c;而函数指针是指向函数。 函数指针可以像一般函数一样&#xff0c;用于调用函数、传递参数。 函数指针变量的声明&#xff1a; typedef int (*fun_ptr)(int,i…...

智慧工厂的基础是什么?功能有哪些?

关键词&#xff1a;智慧工厂、智慧工厂数字化、设备设施数字化、智能运维、工业互联网 1.智慧工厂的定义 智慧工厂是以数字化信息形式的工厂模型为基础&#xff0c;以实现制造系统离线分析设计和实际生产系统运行状态在线监控的新型工厂。智慧工厂的建设在于以高度集成的信息化…...

LeetCode 238. 除自身以外数组的乘积

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 使用前缀和进行解决该题&#xff0c;只不过与之前前缀和不同的是这个题目计算前缀和的时候不需要计算当前元素&#xff0c;也就是当前位置前缀和的值其实是不包含当前元素的前缀和。…...

点击劫持概念及解决办法

1.点击劫持的概念 点击劫持 (Clickjacking) 技术又称为界面伪装攻击 (UI redress attack )&#xff0c;是一种视觉上的欺骗手段。攻击者使用一个或多个透明的 iframe 覆盖在一个正常的网页上&#xff0c;然后诱使用户在该网页上进行操作&#xff0c;当用户在不知情的情况下点击…...

【Spring】手动实现Spring底层机制-问题的引出

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理手动实现Spring底层机制-问题的引出 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1…...

网站手机端排名怎么做/个人网站制作

文章目录前言一、依赖关系是什么&#xff1f;二、支持的功能总结前言 终于更新一个小的python项目来一起动手学习了&#xff0c;今天想看看Redis源码&#xff0c;可惜太慢太多&#xff0c;思维太乱&#xff0c;于是想到看是否用Python可以分析出这个源码直接的依赖关系。 一、…...

网站建设发布平台/网站关键词优化费用

winhex镜像硬盘和ghost备份是完全不同的&#xff0c;ghost只能克隆或者镜像分区内正常的数据&#xff0c;删除的数据他是不会克隆的&#xff0c;所以在数据恢复应用中&#xff0c;ghost对我们来讲作用就不大了&#xff0c;而使用winhex备份&#xff08;镜像&#xff09;硬盘数据…...

wordpress 主题大学/百度怎么投广告

时 间:2015-02-05 08:17:11作 者:摘 要:连接SQL Server 数据库出错的解决方案正 文:经常有人反映说SQL Server 客户端连接不上。现在将这类问题归纳如下&#xff1a;一、SQL Server 实例(服务)未启动打开“SQL Server 配置管理器”(或者“管理工具”中的“服务”)&#xff…...

做网站优化多少钱/如何优化培训方式

项目管理工具Maven安装与配置 1.Maven简介 Maven 是 Apache 软件基金会的一个开源的项目管理工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。 2.Maven中的概念 2.1Pom(Project Object Model)项目对象模型 Mave…...

嘉兴网站建设999 999/下载百度到桌面上

Docker 完全指南 原作者地址: https://wdxtub.com/2017/05/01/docker-guide/ 发表于 2017-05-01 | 更新于 2017-08-03 | 分类于 Technique | | 1669 3,950 | 15Docker 作为新瓶装旧酒的一门技术&#xff0c;用简单便捷的操作极大改变了软件开发的流程与生态环境&#xff0…...

电影网站建设费用/必应站长平台

函数说明示例String.fromCharCode()返回Unicode码对应的字符串String.fromCharCode(20013); // "中"charCodeAt()返回字符的Unicode码中.charCodeAt(); // 20013charAt()返回指定位置的字符abc.charAt(1); // "b"concat()连接两个字符串ab.concat(cd); // …...