Localstack 一个功能齐全的本地AWS云堆栈

概述

LocalStack在本地计算机上启动以下核心云API, 离线开发和测试您的云和无服务器应用程序!

注:从版本开始0.11.0,所有API都通过单个边缘服务,可在以下位置访问http://localhost:4566默认情况下(可通过以下方式进行自定义EDGE_PORT,进一步见下文)

  • ACM
  • API网关
  • 云表单
  • CloudWatch
  • CloudWatch日志
  • DynamoDB
  • DynamoDB流
  • EC2
  • ElasticSearch服务
  • EventBridge(CloudWatch事件)
  • 消防水龙带
  • IAM
  • Kinesis
  • KMS
  • 兰姆达
  • 红移
  • 路由53
  • S3
  • 秘书经理
  • SES
  • SNS
  • SQS
  • SSM
  • 单步执行函数
  • STS

除上述外,Pro version of LocalStack支持其他API和高级功能,包括:

  • 放大
  • API网关V2(WebSockets支持)
  • 应用程序自动缩放
  • AppSync
  • 雅典娜
  • 备份
  • 批次
  • 云前端
  • 云迹(CloudTrail)
  • 科尼托
  • 成本资源管理器
  • ECS/ECR/EKS
  • ElastiCache
  • 弹性豆茎
  • ELB/ELBv2
  • 电子病历
  • 冰川/S3选择
  • IAM安全策略实施
  • 物联网
  • Kinesis数据分析
  • Lambda层和容器图像
  • 用于Kafka的托管流(MSK)
  • 媒体商店
  • 海王星图形DB
  • QLDB
  • RDS/Aurora无服务器
  • 时间流
  • 转接
  • X射线
  • 对大多数服务的高级持久性支持
  • 用于管理资源的交互式UI
  • 测试报告仪表板
  • 还有更多,更多的即将到来!(请查看我们的功能路线图这里:https://roadmap.localstack.cloud)

要求

  • python(最高支持Python 3.6至3.8)
  • pip(Python包管理器)
  • Docker
  • JDK(如果KINESIS_PROVIDERkinesis-mock并且该系统不是AMD64系统。支持8+个)

正在安装

安装LocalStack的最简单方法是通过pip

pip install localstack

注意事项如请务必照办。使用sudo或者rootUser-LocalStack应该完全在本地非root用户下安装和启动。如果您在MacOS X Sierra中的权限有问题,请使用安装pip install --user localstack

正在运行

默认情况下,LocalStack使用以下命令在Docker容器内启动:

localstack start

(请注意,在MacOS上,您可能需要运行TMPDIR=/private$TMPDIR localstack start --docker如果$TMPDIR包含Docker无法挂载的符号链接。)

注意事项:2020-07-11起,默认镜像localstack/localstackin Docker Hub指的是“轻量级版本”,它删除了一些大的依赖文件,比如Elasticsearch(如果需要,还可以懒惰地下载它们)。(请注意,localstack/localstack-light将来可能会删除图像别名)。如果您需要完整的依赖项集,localstack/localstack-full可以改为使用图像。请同时参阅USE_LIGHT_IMAGE下面的配置

注意事项:默认情况下,LocalStack使用标记的图像latest它缓存在您的计算机上,并且将自动从Docker Hub拉取最新镜像(即需要手动拉取镜像)

(注意事项:虽然强烈建议使用Docker,但也可以使用--host启动标志。请注意,这将需要additional dependencies,并且在某些操作系统(包括Windows)上不受支持。)

使用docker

您也可以直接使用docker,并使用以下命令开始使用localstack

docker run --rm -it -p 4566:4566 -p 4571:4571 localstack/localstack

若要在没有任何外部卷的情况下运行一次性容器,请执行以下操作。要启动服务子集,请使用-e "SERVICES=dynamodb,s3"

使用docker-compose

您也可以使用docker-compose.yml文件,然后使用此命令(当前需要docker-compose版本1.9.0+):

docker-compose up

(请注意,在MacOS上,您可能需要运行TMPDIR=/private$TMPDIR docker-compose up如果$TMPDIR包含Docker无法挂载的符号链接。)

为便于互操作性,配置变量可以作为前缀LOCALSTACK_在码头。例如,设置LOCALSTACK_SERVICES=s3相当于SERVICES=s3

使用头盔

您可以使用Helm通过运行以下命令在Kubernetes群集中安装LocalStack(Helm图表在中维护this repo):

helm repo add localstack-repo https://helm.localstack.cloud

helm upgrade --install localstack localstack-repo/localstack

配置

您可以将以下环境变量传递给LocalStack:

  • EDGE_PORT:边缘服务的端口号,所有API调用的主要入口点(默认值:4566)
  • SERVICES:要启动的服务名称(API)的逗号分隔列表。服务名称基本上对应于service names of the AWS CLI(kinesislambdasqs等),尽管LocalStack仅支持其中的一部分。示例值:kinesis,lambda,sqs启动Kinesis、Lambda和SQS。此外,可以指定以下速记值来运行预定义的服务集合:
    • serverless:运行通常用于无服务器应用程序的服务(iamlambdadynamodbapigateways3sns)
  • DEFAULT_REGION:与API通话时使用的AWS区域(默认值:us-east-1)
  • EDGE_BIND_HOST:边缘服务绑定到的地址。(默认值:127.0.0.1,在码头集装箱中0.0.0.0)
  • HOSTNAME:要在内部公开服务的主机的名称(默认值:localhost)。使用此选项来自定义框架内部通信,例如,如果使用docker-compose在不同容器中启动服务
  • HOSTNAME_EXTERNAL:要在外部公开服务的主机的名称(默认值:localhost)。例如,当将队列URL从SQS服务返回到客户端时,使用此主机
  • HOSTNAME_FROM_LAMBDA:端点主机,在该主机下可以从Lambda容器访问API(可选)。这在码头组成堆栈中使用本地容器主机名是有用的(例如,HOSTNAME_FROM_LAMBDA=localstack)如果主容器的IP地址和容器名称都不可用(例如,在CI中)。常与…连用LAMBDA_DOCKER_NETWORK
  • DEBUG:用于提高日志级别并打印更多详细日志的标志(用于故障排除)
  • <SERVICE>_PORT_EXTERNAL:向外部公开特定服务的端口号(默认为上面的服务端口)。SQS_PORT_EXTERNAL例如,将队列URL从SQS服务返回到客户端时使用
  • IMAGE_NAME:要使用的LocalStack Docker映像的特定名称和标签,例如,localstack/localstack:0.11.0(默认值:localstack/localstack)
  • USE_LIGHT_IMAGE:是否使用轻量级Docker镜像(默认为:1)。被覆盖IMAGE_NAME
  • KINESIS_PROVIDER:确定正在使用的模拟。有效值为kinesalitekinesis-mock(默认)
  • KINESIS_ERROR_PROBABILITY:0.0(默认值)和1.0之间的十进制值随机注入ProvisionedThroughputExceededExceptionKinesis API响应中的错误
  • KINESIS_SHARD_LIMIT:整数值(默认值:100)或Infinity(以禁用),导致Kinesis API开始引发异常以模仿default shard limit
  • KINESIS_LATENCY:毫秒整数值(默认值:500)或0(禁用),导致Kinesis API延迟返回响应,以模拟实时AWS调用的延迟。以下API调用受此影响:
    • CreateStream
    • 删除流
    • RegisterStreamConsumer
    • StartStreamEncryption
    • 停止流加密
    • DeregisterStreamConsumer
    • 合并碎片
    • 拆分碎片
    • 更新硬计数
  • KINESIS_INITIALIZE_STREAMS:以逗号分隔的流名称字符串及其对应的要在启动期间初始化的分片计数。例如:“my-first-stream:1,my-ther-stream:2,my-last-stream:1”。仅适用于kinesis-mockKinesis_Provider
  • DYNAMODB_ERROR_PROBABILITY:0.0(默认值)和1.0之间的十进制值随机注入ProvisionedThroughputExceededExceptionDynamoDB API响应中的错误
  • DYNAMODB_HEAP_SIZE:设置DynamoDB值的Java EE最大内存大小为(整数)m表示MB,(整数)G表示GB默认值(256M),全表扫描需要更多内存
  • STEPFUNCTIONS_LAMBDA_ENDPOINT:在STEP函数中用作Lambda服务端点的URL。默认情况下,这是LocalStack Lambda端点。使用default要选择原始AWS Lambda端点,请执行以下操作
  • LAMBDA_EXECUTOR:用于执行Lambda函数的方法。可能的值包括:
    • local:在本地计算机的临时目录中运行Lambda函数
    • docker:在单独的Docker容器中运行每个函数调用
    • docker-reuse:为每个函数创建一个Docker容器,并跨调用重用它

    dockerdocker-reuse,如果LocalStack本身在Docker内部启动,则docker命令需要在容器内可用(通常需要在特权模式下运行容器)。默认值为docker,回退到local如果Docker不可用

  • LAMBDA_REMOTE_DOCKER确定是否将Lambda代码复制或装载到容器中。可能的值包括:
    • true(默认):您的Lambda函数定义将通过复制zip文件传递到容器(可能较慢)。它允许远程执行,其中主机和客户端不在同一台计算机上
    • false:您的Lambda函数定义将通过挂载卷(可能更快)传递给容器。这需要将Docker客户端和Docker主机安装在同一台计算机上。另外,HOST_TMP_FOLDER必须正确设置,并且像这样的卷装载${HOST_TMP_FOLDER}:/tmp/localstack如果您使用的是docker-compose,则需要进行配置
  • BUCKET_MARKER_LOCAL:本地运行lambdas的可选存储桶名称
  • LAMBDA_DOCKER_NETWORK:可选Docker网络,用于运行lambda函数的容器
  • LAMBDA_DOCKER_DNS:运行lambda函数的容器的可选DNS服务器
  • LAMBDA_DOCKER_FLAGS:传递给Lambda Docker的其他标志run/create命令(例如,用于指定自定义卷装载)
  • LAMBDA_CONTAINER_REGISTRY使用备用docker注册表拉取lambda执行容器(默认:lambci/lambda)
  • LAMBDA_REMOVE_CONTAINERS:lambdas执行完毕后是否移除容器(默认:true)
  • TMPDIR:LocalStack容器内的临时文件夹(默认值:/tmp)
  • HOST_TMP_FOLDER:装载为的主机上的临时文件夹$TMPDIR/localstack放到LocalStack容器中。仅在使用时装载Lambda卷时需要LAMBDA_REMOTE_DOCKER=false
  • DATA_DIR:保存持久数据的本地目录(目前仅支持以下服务:Kinesis、DynamoDB、Elasticsearch、S3、Secretsmanager、SSM、SQS、SNS)。将其设置为/tmp/localstack/data要启用持久性(/tmp/localstack挂载到Docker容器中),则保留为空以禁用持久化(默认)
  • PERSISTENCE_SINGLE_FILE:指定是否应合并持久性文件。(默认值:true)
  • PORT_WEB_UI:Web用户界面/仪表板的端口(默认:8080)。请注意,Web UI现在已弃用(需要使用激活START_WEB=1),并要求使用localstack/localstack-fullDocker镜像
  • <SERVICE>_BACKEND:用于特定服务的自定义端点URL,其中<SERVICE>是大写的服务名称(当前适用于:APIGATEWAYCLOUDFORMATIONDYNAMODBELASTICSEARCHKINESISS3SNSSQS)。这样就可以轻松地将第三方服务集成到LocalStack中。您可以查看一个elasticsearch example here
  • FORCE_NONINTERACTIVE:使用Docker运行时,禁用--interactive--tty旗帜。在无头运行时很有用
  • DOCKER_FLAGS:允许在Docker中运行LocalStack时将自定义标志(例如,卷装载)传递给“docker run”
  • DOCKER_CMD:用于运行Docker容器的shell命令,例如,设置为"sudo docker"以sudo身份运行(默认值:docker)
  • SKIP_INFRA_DOWNLOADS:是否跳过下载其他基础架构组件(例如,特定的Elasticsearch版本)
  • START_WEB:用于控制是否应在Docker中启动Web UI的标志(默认值:false;已弃用)
  • LAMBDA_FALLBACK_URL:调用不存在的Lambda时使用的回退URL。记录DynamoDB(值)中的调用dynamodb://<table_name>)或将调用作为POST请求(值http(s)://...)
  • LAMBDA_FORWARD_URL:用于转发所有lambda调用的URL(用于通过外部服务运行lambdas)
  • DISABLE_CORS_CHECKS:是否禁用所有CSRF缓解(默认值:0)
  • DISABLE_CUSTOM_CORS_S3:是否通过S3禁用CORS覆盖(默认值:0)
  • DISABLE_CUSTOM_CORS_APIGATEWAY:禁用由apigateway覆盖CORS的内容(默认值:0)
  • EXTRA_CORS_ALLOWED_ORIGINS:允许与本地堆栈通信的来源的逗号分隔列表
  • EXTRA_CORS_ALLOWED_HEADERS:要添加到的以逗号分隔的标头名称列表Access-Control-Allow-HeadersCORS标头
  • EXTRA_CORS_EXPOSE_HEADERS:要添加到的以逗号分隔的标头名称列表Access-Control-Expose-HeadersCORS标头
  • LAMBDA_JAVA_OPTS:允许传递自定义JVM选项(例如,-Xmx512M)到在Docker中执行的Java lambdas。使用_debug_port_用于配置调试端口的占位符(例如,-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=_debug_port_)
  • MAIN_CONTAINER_NAME:指定主坞容器名称(默认值:localstack_main)
  • INIT_SCRIPTS_PATH:指定扩展名为.sh的初始化文件的路径,这些文件默认位于/docker-entrypoint-initaws.d
  • LS_LOG:指定日志级别(‘trace’、‘debug’、‘info’、‘warn’、‘error’、‘warning’)当前重写DEBUG配置。启用LS_LOG=trace打印详细的请求/响应消息

以下环境配置可用于调试:

  • DEVELOP:在启动本地堆栈服务之前启动调试服务器
  • DEVELOP_PORT:调试服务器的端口号
  • WAIT_FOR_DEBUGGER:强制LocalStack等待调试器启动服务

以下环境配置包括已弃用

  • USE_SSL:是否使用https://...使用SSL加密的URL(默认值:false)。从版本0.11.3起不建议使用-每个服务端点现在都支持在同一端口上多路传输HTTP/HTTPS流量

此外,还包括以下内容只读环境变量可用:

  • LOCALSTACK_HOSTNAME:LocalStack服务可用的主机的名称。使用该主机名作为端点(例如,http://${LOCALSTACK_HOSTNAME}:4566)以便从Lambda函数中访问服务(例如,将项从Lambda存储到DynamoDB或S3)

将上述环境变量传递给LocalStack以启动Kinesis、Lambda、DynamoDB和SQS的示例:

SERVICES=kinesis,lambda,sqs,dynamodb localstack start

使用命令行验证坞站合成配置

您可以使用localstack config validate用于检查常见配置错误的命令

默认情况下,它会验证docker-compose.yml,则可以使用--file参数,例如:

localstack config validate --file=localstack-docker-compose.yml

在运行时动态更新配置

列出的每个服务APIabove在PATH下定义后门API/?_config_中定义的配置变量,它允许动态更新config.py

您需要通过设置来启用此终结点ENABLE_CONFIG_UPDATES=1

例如,要动态设置KINESIS_ERROR_PROBABILITY=1在运行时,使用以下命令:

curl -v -d '{"variable":"KINESIS_ERROR_PROBABILITY","value":1}' 'http://localhost:4566/?_config_'

服务运行状况检查

这项服务/health检查边缘端口上的端点(http://localhost:4566/health默认情况下)提供关于每个服务的状态的基本信息(例如,{"s3":"running","es":"starting"})。默认情况下,端点返回在启动期间确定的缓存值-状态值可以通过添加reload查询参数:http://localhost:4566/health?reload

初始化新实例

首次启动容器时,它将执行扩展名为.sh的文件,这些文件位于/docker-entrypoint-initaws.d或中定义的备用路径INIT_SCRIPTS_PATH文件将按字母顺序执行。您可以使用以下命令在本地堆栈上轻松创建AWS资源awslocal(或aws)初始化脚本中的CLI工具

使用自定义SSL证书

要使用您自己的SSL证书而不是随机生成的证书,您可以放置一个文件server.test.pem放入LocalStack临时目录($TMPDIR/localstack,或/tmp/localstack默认情况下)。该文件server.test.pem必须包含密钥文件以及证书文件内容:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

将自定义SSL证书与docker-compose配合使用

通常,使用docker-compose可以将此卷添加到docker-compose.yml到LocalStack服务中:

  volumes:
    - "${PWD}/ls_tmp:/tmp/localstack"
    - "/var/run/docker.sock:/var/run/docker.sock"

本地目录/ls_tmp必须包含三个文件(server.test.pem、server.test.pem.crt、server.test.pem.key)

通过CLI或代码访问基础架构

你可以把你的aws使用本地基础架构的CLI,例如:

aws --endpoint-url=http://localhost:4566 kinesis list-streams
{
    "StreamNames": []
}

使用以下命令安装aws CLI,如果尚未安装

pip install awscli

设置本地区域和凭据以运行LocalStack

AWS需要设置区域和凭证才能运行AWS命令。创建默认配置&凭据。以下密钥将要求提供访问密钥ID、秘密访问密钥、区域和输出格式

aws configure --profile default

# Config & credential file will be created under ~/.aws folder

注意事项:请使用test作为访问密钥ID和秘密访问密钥,以使S3预签名URL工作。我们增加了前缀url签名验证算法来验证前缀url及其有效期。您可以使用将凭据配置到系统环境中export命令在Linux/Mac系统中运行。您还可以在中添加凭据~/.aws/credentials直接归档

export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test

新的:退房awslocal,一个直接针对LocalStack运行命令的精简CLI包装器(无需指定--endpoint-url再也没有了)。通过以下方式安装pip install awscli-local,然后按如下方式使用:

awslocal kinesis list-streams
{
    "StreamNames": []
}

更新:使用环境变量$LOCALSTACK_HOSTNAME来确定lambda函数中的目标主机。看见Configurations部分了解更多详细信息。

将官方AWS CLI版本2 Docker映像与Localstack Docker容器配合使用

默认情况下,运行的容器amazon/aws-cli0.0.0.0:4566在主机上,这意味着aws-cli无法通过您的shell访问本地堆栈

要确保两个坞站容器可以通信,请在坞站引擎上创建网络:

$ ▶ docker network create localstack
0c9cb3d37b0ea1bfeb6b77ade0ce5525e33c7929d69f49c3e5ed0af457bdf123

然后修改docker-compose.yml指定要使用的网络:

networks:
  default:
    external:
      name: "localstack"

使用此网络运行AWS Cli v2坞站容器(示例):

$ ▶ docker run --network localstack --rm -it amazon/aws-cli --endpoint-url=http://localstack:4566 lambda list-functions
{
    "Functions": []
}

如果您经常从坞站容器使用AWS CLI v2,请创建别名:

$ ▶ alias laws='docker run --network localstack --rm -it amazon/aws-cli --endpoint-url=http://localstack:4566'

因此,您可以键入:

$ ▶ laws lambda list-functions
{
    "Functions": []
}

客户端库

正在调用API网关

而AWS上的API网关端点使用自定义DNS名称来标识API ID(例如,https://nmafetnwf6.execute-api.us-east-1.amazonaws.com/prod/my/path),LocalStack使用特殊的URL路径指示符.../_user_request_/...指示睡觉API方法的执行

API网关执行的URL模式为http://localhost:4566/restapis/<apiId>/<stage>/_user_request_/<methodPath>上面的示例URL将映射到以下内容localhostURL:

$ curl http://localhost:4566/restapis/nmafetnwf6/prod/_user_request_/my/path

与pytest集成

如果您想在集成测试中使用LocalStack(例如pytest),只需启动测试设置方法中的基础设施,然后清除tearDown方法中的所有内容:

from localstack.services import infra

def setup():
    infra.start_infra(asynchronous=True)

def teardown():
    infra.stop_infra()

def my_app_test():
    # here goes your test logic

请参阅示例测试文件tests/integration/test_integration.py有关更多详细信息,请参阅

与无服务器集成

您可以使用serverless-localstack易于运行的插件ServerlessLocalStack上的应用程序。有关更多信息,请查看此处的插件存储库:https://github.com/localstack/serverless-localstack

与Terraform集成

您可以使用Terraform在本地配置您的资源。请参阅Terraform AWS提供商文档here有关如何在上配置API端点的信息localhost

将本地代码与Lambda一起使用

要挂载本地文件夹,请确保LAMBDA_REMOTE_DOCKER设置为false然后将S3存储桶名称设置为__local__BUCKET_MARKER_LOCAL如果已设置,并且S3键指向您的本地路径:

awslocal lambda create-function --function-name myLambda \
    --code S3Bucket="__local__",S3Key="/my/local/lambda/folder" \
    --handler index.myHandler \
    --runtime nodejs8.10 \
    --role whatever

注:在使用时LAMBDA_REMOTE_DOCKER=false,请确保正确设置HOST_TMP_FOLDERLocalStack容器的环境变量(请参见上面的配置部分)

与Java/JUnit集成

为了在Java中使用LocalStack,该项目附带了一个简单的JUnit运行器,请参见下面的示例

...
import cloud.localstack.LocalstackTestRunner;
import cloud.localstack.TestUtils;
import cloud.localstack.docker.annotation.LocalstackDockerProperties;

@RunWith(LocalstackTestRunner.class)
@LocalstackDockerProperties(services = { "s3", "sqs", "kinesis:77077" })
public class MyCloudAppTest {

  @Test
  public void testLocalS3API() {
    AmazonS3 s3 = TestUtils.getClientS3()
    List<Bucket> buckets = s3.listBuckets();
    ...
  }
}

有关更多详细信息和配置参数的完整列表,请参阅LocalStack Java Utils存储库

故障排除

  • 如果您将AWS Java库与Kinesis配合使用,请参阅CBOR protocol issues with the Java SDK guide如何禁用kinesalite不支持的CBOR协议
  • 访问本地S3:为避免域名解析问题,需要开启路径样式访问在您的S3SDK客户端上。大多数AWS SDK都提供配置来实现这一点,例如,对于Java:
s3.setS3ClientOptions(S3ClientOptions.builder().setPathStyleAccess(true).build());
// There is also an option to do this if you're using any of the client builder classes:
AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard();
builder.withPathStyleAccessEnabled(true);
...
  • 正在挂载临时工。目录:请注意,在MacOS上,您可能必须运行TMPDIR=/private$TMPDIR docker-compose up如果$TMPDIR包含Docker无法挂载的符号链接。(请在此处查看详细信息:https://bitbucket.org/atlassian/localstack/issues/40/getting-mounts-failed-on-docker-compose-up)
  • 如果您看到像这样的Lambda错误Cannot find module ...在使用时LAMBDA_REMOTE_DOCKER=false,请确保正确设置HOST_TMP_FOLDER环境变量,并将临时文件夹从主机挂载到LocalStack容器
  • 如果您在以下位置遇到文件权限问题pip install在MacOS下(例如,Permission denied: '/Library/Python/2.7/site-packages/six.py'),则您可能需要重新安装pipVia Homebrew(请参见this discussion thread)。或者,尝试使用--user标志:pip install --user localstack
  • 如果您在OpenShift内部署,请注意:Pod必须以root,并且用户必须将权能添加到正在运行的Pod中,才能允许Elasticsearch作为非根用户运行localstack用户
  • 如果您在Mac OS中遇到lambdas性能较慢的问题,您可以(1)尝试mounting local code directly into the Lambda container,或(2)禁止在docker-compose中将临时目录挂载到LocalStack容器中。(另见https://github.com/localstack/localstack/issues/2515)
  • 环境变量no_proxy由LocalStack重写。(内部请求将直接通过localhost,绕过任何代理配置)
  • 要对LocalStack启动问题进行故障排除,可以通过运行以下命令检查调试日志DEBUG=1 localstack start
  • 如果您遇到与Node/NodeJS相关的错误,您可以找到(此问题备注:https://github.com/localstack/localstack/issues/227#issuecomment-319938530)很有帮助
  • 如果您正在使用AWS Java库并需要禁用SSL证书检查,请添加-Dcom.amazonaws.sdk.disableCertChecking添加到java调用

发展中的

在本地开发或启动的要求

要开发新功能,或在本地启动堆栈(在Docker之外),需要以下附加工具:

  • make
  • npm(Node.js包管理器)
  • java/javac(Java 8运行时环境和编译器)
  • mvn(Maven,Java的构建系统)
  • moto(用于测试)
  • docker-compose(用于使用docker-compose运行本地堆栈)
  • mock(用于单元测试)
  • pytest(用于单元测试)
  • pytest-cov(检查单元测试覆盖率)

开发环境

如果为了扩展/修改LocalStack而拉回回购,请运行以下命令以安装所有依赖项:

make install

这将在本地Python viralenv目录中安装所需的pip依赖项.venv(您的全局python包将保持不变),以及中的一些节点模块。./localstack/node_modules/根据您的系统,某些pip/npm模块可能需要安装其他本地库。

Makefile包含一个目标,用于方便地运行用于开发的本地基础设施:

make infra

使用Vagant启动LocalStack(CentOS 8)

这类似于make docker-mount-run,但不是启动docker centos虚拟机,而是将源代码挂载到其中

前提条件
  • 流浪汉
  • vagrant plugin install vagrant-vbguest
启动流浪汉
  • make vagrant-start(准备好提供系统密码)
使用流浪汉
  • vagrant ssh
  • sudo -s
  • cd /localstack
  • SERVICES=dynamodb DEBUG=1 make docker-mount-run
停止流浪汉
  • make vagrant-stopvagrant halt
删除流浪VM
  • vagrant destroy

请查看developer guide其中包含一些关于如何开始开发(和调试)LocalStack功能的说明

测试

该项目包含一组可以通过make目标启动的单元和集成测试:

make test

要检查代码覆盖率,请执行以下操作

完成新功能/错误修复后,运行单元测试并检查覆盖范围

# To run the particular test file (sample)
pytest --cov=localstack tests/unit/test_common.py

# To check the coverage in the console
coverage report

# To check the coverage as html (output will be redirected to the html folder)
coverage html

Web仪表板(已弃用)

这些项目还附带一个简单的Web仪表板,可用于查看已部署的AWS组件以及它们之间的关系

localstack web

请注意,Web UI需要使用Docker映像的扩展版本(localstack/localstack-full)

注:Web仪表板不再进行主动维护,可能会在即将发布的版本中删除

其他UI客户端

更改日志

请参阅CHANGELOG.md要查看每个版本的完整更改列表,请执行以下操作

贡献

我们欢迎反馈、错误报告和拉请求!

对于拉取请求,请遵循以下指导原则:

  • 添加对任何新功能和错误修复的测试。理想情况下,每个PR都应该增加测试覆盖率
  • 遵循现有代码样式(例如,缩进)。Makefile中包含PEP8代码链接目标
  • 在代码中添加合理数量的注释
  • 在您的GitHub用户帐户上派生本地堆栈,在那里进行更改,然后根据主本地堆栈存储库创建PR
  • 将不相关的更改分离到多个拉取请求中
  • 每个PR 1个提交:请将多个提交压缩/重新设置为单个提交的基础(以保持历史记录的干净)

请注意,通过向此存储库贡献任何代码或文档(通过提出拉请求或其他方式),您明确同意Contributor License Agreement

贡献者

这个项目的存在要归功于所有做出贡献的人。

支持者

感谢我们所有的支持者!🙏[Become a backer]

赞助商

通过成为赞助商来支持这个项目。您的徽标将在此处显示,并带有指向您的网站的链接。[Become a sponsor]










随时间流逝的观星者

许可证

版权所有(C)2017-2020 LocalStack维护者和贡献者

版权所有(C)2016 Atlassian和其他

此版本的LocalStack是在Apache许可证2.0版(请参阅LICENSE.txt)下发布的。下载并使用本软件,即表示您同意End-User License Agreement (EULA)

我们基于多个第三方软件工具构建,包括:

第三方软件 许可证
Python/pip模块:
空速 BSD许可证
Amazon_kclpy 亚马逊软件许可证
Boto3 Apache License 2.0
覆盖范围 Apache License 2.0
文档选项 麻省理工学院许可证
弹性搜索 Apache License 2.0
烧瓶 BSD许可证
烧瓶招摇过市 麻省理工学院许可证
jsonpath-RW Apache License 2.0
摩托 Apache License 2.0
请求 Apache License 2.0
子进程32 PSF许可证
Node.js/npm模块:
活塞利特(Kinesalite) 麻省理工学院许可证
其他工具:
弹性搜索 Apache License 2.0
本地-KMS 麻省理工学院许可证
Kinesis-模拟 麻省理工学院许可证

公告

  • 2021-04-24我们要招人了!-如果您喜欢我们在LocalStack所做的工作,请查看我们的jobs board然后给我们发一封电子邮件,告诉我们你的简历/背景/投资组合。我们期待着您的回音!
  • 2020/12/28:查看LocalStack Pro功能路线图这里:https://roadmap.localstack.cloud-请通过创建和提升功能请求来帮助我们确定积压工作的优先顺序。期待您的反馈!
  • 2020-09-15:PR#2905中合并了一个重大(突破性)更改-从以下版本开始v0.11.5,所有服务现在仅通过边缘服务(端口4566)公开!请更新您的客户端配置以使用此新端点
  • 2019-10-09LocalStack Pro已推出!我们非常兴奋地宣布推出LocalStack Pro-具有附加API和高级功能的LocalStack企业版。请访问以下地址查看免费试用https://localstack.cloud
  • 2018-01-10需要帮助!fill out this survey支持查尔默斯理工大学进行的一项关于无服务器和功能即服务(FAAS)服务使用情况的研究。调查只需要你5-10分钟的时间。非常感谢您的参与!!
    • 这项研究的结果是可以找到的here
  • 2017-08-27我们需要你的支持!LocalStack正在快速发展,我们现在有数千名开发人员定期使用该平台。上个月,我们记录了惊人的100k测试运行,25k+DynamoDB表、20k+SQS队列、15k+Kinesis Streams、13k+S3存储桶和10k+Lambda函数在本地创建-成本为0美元(更多详细信息将很快公布)。bug和功能请求如潮水般涌入,我们现在需要来自保持开放源码版本的积极维护。请给我退房Open Collective并成为一名backersupporter今天是项目的第一天!谢谢大家的贡献。♥
  • 2017/07/20:请注意:从版本开始0.7.0,将推送Docker映像并使其处于最新状态新名称localstack/localstack(这意味着您可能需要更新您的配置项配置。)请参阅更新后的End-User License Agreement (EULA)用于新版本。旧的Docker映像(atlassianlabs/localstack)仍然可用,但不会再维护

100-Days-Of-ML-Code-100天的ML编码

ML-100天代码

100天机器学习 Siraj Raval

获取数据集: here

数据预处理|第1天

从以下位置签出代码: here

简单线性回归|第2天

从以下位置签出代码here

多元线性回归|第3天

从以下位置签出代码here

Logistic回归|第4天

Logistic回归|第5天

今天进入#100DaysOfMLCode,我更深入地研究了Logistic回归到底是什么,以及它背后涉及的数学知识是什么。学习了成本函数的计算方法,以及如何将梯度下降算法应用于成本函数,使预测误差最小化
由于时间不多,我现在会隔天贴一张信息图。此外,如果有人想要帮助我编写代码文档,并且已经在该领域有一些经验,并且知道GitHub的Markdown,请在LinkedIn上与我联系:)

实施Logistic回归|第6天

查看代码here

K个最近的邻居|第7天

Logistic回归背后的数学|第8天

#100DaysOfMLCode为了阐明我对逻辑回归的见解我在互联网上搜索了一些资源或文章,我偶然看到了这篇文章(https://towardsdatascience.com/logistic-regression-detailed-overview-46c4da4303bc)Saishruthi Swminathan著

对Logistic回归进行了详细的描述。一定要检查一下

支持向量机|第9天

对支持向量机是什么以及如何使用它来解决分类问题有了一个直观的了解

支持向量机和KNN|第10天

了解有关支持向量机的工作原理和实现K-NN算法的详细信息

K-NN实施|第11天

实现了K-NN分类算法。#100DaysOfMLCode支持向量机信息图已完成一半。明天会更新的

支持向量机|第12天

朴素贝叶斯分类器|第13天

今天继续讨论#100DaysOfMLCode,我介绍了朴素贝叶斯分类器。我还使用SCISKIT-LEARN在python中实现了支持向量机。将很快更新代码

支持向量机实施|第14天

今天我在线性相关的数据上实现了支持向量机。二手Scikit学习图书馆。在Scikit-Learning中,我们使用SVC分类器来完成这项任务。将在下一次实现中使用内核技巧。检查代码here

朴素贝叶斯分类器和黑盒机器学习|第15天

学习了不同类型的朴素贝叶斯分类器。也是通过以下方式开始讲课的Bloomberg播放列表中的第一个是黑盒机器学习。对预测函数、特征提取、学习算法、性能评估、交叉验证、样本偏差、非平稳性、过拟合和超参数调整等方面进行了全面的综述

使用内核技巧实现支持向量机|第16天

利用Scikit-Learning库实现了支持向量机算法,并利用核函数将数据点映射到更高的维来寻找最优超平面

在Coursera|第17天开始深度学习专业化认证

在一天内完成整个第一周和第二周。学习Logistic回归作为神经网络

Coursera上的深度学习专业化认证|第18天

完成深度学习专业化课程1。用python实现了一个神经网络。

“学习问题”,亚瑟·阿布-穆斯塔法教授(Yaser Abu-Mostafa)|第19天

开始了加州理工学院机器学习课程(CS156)第18讲中的第1讲,由Yaser Abu-Mostafa教授主讲。这基本上是对即将到来的讲座的介绍。他还解释了感知器算法

开始深度学习专业化认证课程2|第20天

完成了改进深度神经网络的第一周:超参数调整、正则化和优化

Web抓取|第21天

观看了有关如何使用美丽汤进行Web抓取的教程,以便为构建模型收集数据

学习可行吗?|第22天

加州理工学院机器学习课程(CS156)第18讲第2讲,亚瑟·阿布-穆斯塔法教授主讲。了解Hoeffding不等式

诊断树|第23天

统计学习理论简介|第24天

Bloomberg ML课程的LEC3介绍了一些核心概念,如输入空间、动作空间、结果空间、预测函数、损失函数和假设空间

实施决策树|第25天

检查代码here.

跳过复习线性代数|第26天

发现了一个令人惊叹的channel在YouTube3Blue1Brown上。它有一个名为“线性代数精髓”的播放列表。从完成4个视频开始,这些视频完整地概述了向量、线性组合、跨度、基向量、线性变换和矩阵乘法

链接到播放列表here.

跳过复习线性代数|第27天

继续播放已完成的4个视频,讨论主题3D变换、行列式、逆矩阵、列空间、零空间和非平方矩阵

链接到播放列表here.

跳过复习线性代数|第28天

在3Blue1Brown的播放列表中,完成了另外3个来自线性代数本质的视频。涵盖的主题是点积和交积

链接到播放列表here.

跳过复习线性代数|第29天

今天完成了整个播放列表,视频12-14。这真是一个令人惊叹的播放列表,可以刷新线性代数的概念。主题包括基数、特征向量和特征值的变化,以及抽象向量空间

链接到播放列表here.

微积分精髓|第30天

由3Blue1Brown完成播放列表-线性代数的精髓,这是YouTube针对同一频道3Blue1Brown再次出现的一系列视频提出的建议。上一个线性代数系列已经给我留下了深刻的印象,我直接投入其中。完成了关于导数、链式规则、乘积规则和指数导数等主题的约5个视频

链接到播放列表here.

微积分精髓|第31天

观看了2个关于微积分播放列表实质的主题隐含区分和限制的视频

链接到播放列表here.

微积分精髓|第32天

观看了剩余的4个视频,涵盖了积分和高阶导数等主题

链接到播放列表here.

随机森林|第33天

实施随机林|第34天

检查代码here.

但是什么呢?神经网络?|深度学习,第1章|第35天

由3Blue1Brown YouTube频道在神经网络上发布的令人惊叹的视频。本视频对神经网络有很好的理解,并使用手写数字数据集来解释概念。链接到video.

梯度下降,神经网络如何学习|深度学习,第2章|第36天

第二部分神经网络由3Blue1Brown YouTube频道提供。这个视频以一种有趣的方式解释了渐变下降的概念。169必看,强烈推荐。链接到video.

反向传播到底在做什么?|深度学习,第3章|第37天

第三部分神经网络由3Blue1Brown YouTube频道提供。这个视频主要讨论偏导数和反向传播。链接到video.

反向传播演算|深度学习,第4章|第38天

第四部分神经网络由3Blue1Brown YouTube频道提供。这里的目标是用一些更正式的术语来表示反向传播如何工作的直觉,以及视频中讨论偏导数和反向传播的视频。链接到video.

使用Python、TensorFlow和Kera进行深度学习教程|第39天

链接到video.

加载您自己的数据-使用Python、TensorFlow和Kera的深度学习基础知识p2|第40天

链接到video.

卷积神经网络-使用Python、TensorFlow和Kera的深度学习基础第3页|第41天

链接到video.

使用TensorBoard分析模型-使用Python、TensorFlow和Kera进行深度学习第4页|第42天

链接到video.

K表示群集|第43天

转向无监督学习,研究了聚类问题。在我的网站上工作,检查一下avikjain.me我还发现了一个很棒的动画,可以帮助您轻松理解K-Means聚类Link

K表示群集实施|第44天

实现了K均值聚类。检查代码here.

深入挖掘|NUMPY|第45天

我买了一本JK Vanderplas的新书《Python数据科学手册》Check the Jupyter Notebookhere.

从第2章:Numpy简介开始。介绍了数据类型、Numpy数组和Numpy数组上的计算等主题
检查代码-
Introduction to NumPy

Understanding Data Types in Python

The Basics of NumPy Arrays

Computation on NumPy Arrays: Universal Functions

深入挖掘|NUMPY|第46天

第二章:汇总、比较和广播
链接到笔记本电脑:
Aggregations: Min, Max, and Everything In Between

Computation on Arrays: Broadcasting

Comparisons, Masks, and Boolean Logic

深入挖掘|NUMPY|第47天

第2章:奇特索引、排序数组、结构化数据
链接到笔记本电脑:
Fancy Indexing

Sorting Arrays

Structured Data: NumPy’s Structured Arrays

更深入地挖掘|熊猫|第48天

第3章:使用熊猫进行数据操作
涵盖了各种主题,如Pandas对象、数据索引和选择、对数据的操作、处理丢失的数据、分层索引、合并和追加
指向笔记本的链接:
Data Manipulation with Pandas

Introducing Pandas Objects

Data Indexing and Selection

Operating on Data in Pandas

Handling Missing Data

Hierarchical Indexing

Combining Datasets: Concat and Append

更深地挖掘|熊猫|第49天

第3章:完成以下主题-合并和联接、聚合和分组以及透视表
Combining Datasets: Merge and Join

Aggregation and Grouping

Pivot Tables

更深入地挖掘|熊猫|第50天

第3章:矢量化字符串运算,使用时间序列
指向笔记本的链接:
Vectorized String Operations

Working with Time Series

High-Performance Pandas: eval() and query()

深挖|MATPLOTLIB|第51天

第4章:使用Matplotlib实现可视化学习简单线图、简单散点图、密度图和等高线图
指向笔记本的链接:
Visualization with Matplotlib

Simple Line Plots

Simple Scatter Plots

Visualizing Errors

Density and Contour Plots

深入挖掘|MATPLOTLIB|第52天

第4章:使用Matplotlib实现可视化学习了直方图、如何自定义绘图图例、颜色条和构建多个子图表
指向笔记本的链接:
Histograms, Binnings, and Density

Customizing Plot Legends

Customizing Colorbars

Multiple Subplots

Text and Annotation

深挖|MATPLOTLIB|第53天

第四章介绍了Mathplotlib中的三维绘图
指向笔记本的链接:
Three-Dimensional Plotting in Matplotlib

分层群集|第54天

对层次聚类进行了研究。看看这个令人惊叹的Visualization.

干货源码剖析!详解 Celery Beat 实现原理

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,它是一个专注于实时处理的任务队列,同时也支持任务调度。

为了讲解 Celery Beat 的周期调度机制及实现原理,我们会基于Django从制作一个简单的周期任务开始,然后一步一步拆解 Celery Beat 的源代码。

相关前置应用知识,可以阅读以下文章:

1.Django Celery 异步与定时任务实战教程
2.Python Celery 异步快速下载股票数据

1.Celery 简单周期任务示例

在 celery_app.tasks.py 中添加如下任务:

@shared_task
def pythondict_task():
    print("pythondict_task")

在 django.celery.py 文件中添加如下配置,

from celery_django import settings
from datetime import timedelta


app.autodiscover_tasks(lambda : settings.INSTALLED_APPS)

CELERYBEAT_SCHEDULE = {
    'pythondict_task': {
        'task': 'celery_app.tasks.pythondict_task',
        'schedule': timedelta(seconds=3),
    },
}

app.conf.update(CELERYBEAT_SCHEDULE=CELERYBEAT_SCHEDULE)

至此,配置完成,此时,先启动 Celery Beat 定时任务命令:

celery beat -A celery_django -S django

然后打开第二个终端进程启动消费者:

celery -A celery_django worker 

此时在worker的终端上就会输出类似如下的信息:

    [2021-07-11 16:34:11,546: WARNING/PoolWorker-3] pythondict_task
    [2021-07-11 16:34:11,550: WARNING/PoolWorker-4] pythondict_task
    [2021-07-11 16:34:11,551: WARNING/PoolWorker-2] pythondict_task
    [2021-07-11 16:34:11,560: WARNING/PoolWorker-1] pythondict_task

看到结果正常输出,说明任务成功定时执行。

2.源码剖析

为了明白 Celery Beat 是如何实现周期任务调度的,我们需要从 Celery 源码入手。

当你执行 Celery Beat 启动命令的时候,到底发生了什么?

celery beat -A celery_django -S django

当你执行这个命令的时候,Celery/bin/celery.py 中的 CeleryCommand 类接收到命令后,会选择 beat 对应的类执行如下代码:

# Python 实用宝典
# https://pythondict.com

from celery.bin.beat import beat

class CeleryCommand(Command):
    commands = {
        # ...
        'beat': beat,
        # ...
    }
    # ...
    def execute(self, command, argv=None):
        try:
            cls = self.commands[command]
        except KeyError:
            cls, argv = self.commands['help'], ['help']
        cls = self.commands.get(command) or self.commands['help']
        try:
            return cls(
                app=self.app, on_error=self.on_error,
                no_color=self.no_color, quiet=self.quiet,
                on_usage_error=partial(self.on_usage_error, command=command),
            ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
        except self.UsageError as exc:
            self.on_usage_error(exc)
            return exc.status
        except self.Error as exc:
            self.on_error(exc)
            return exc.status

此时cls对应的是beat类,通过查看位于bin/beat.py中的 beat 类可知,该类只重写了run方法和add_arguments方法。

所以此时执行的 run_from_argv 方法是 beat 继承的 Command 的 run_from_argv 方法:

# Python 实用宝典
# https://pythondict.com

def run_from_argv(self, prog_name, argv=None, command=None):
    return self.handle_argv(prog_name, sys.argv if argv is None else argv, command)

该方法中会调用 Command 的 handle_argv 方法,而该方法在经过相关参数处理后会调用 self(*args, **options) 到 __call__ 函数:

    # Python 实用宝典
    # https://pythondict.com
    
    def handle_argv(self, prog_name, argv, command=None):
        """Parse command-line arguments from ``argv`` and dispatch
        to :meth:`run`.

        :param prog_name: The program name (``argv[0]``).
        :param argv: Command arguments.

        Exits with an error message if :attr:`supports_args` is disabled
        and ``argv`` contains positional arguments.

        """
        options, args = self.prepare_args(
            *self.parse_options(prog_name, argv, command))
        return self(*args, **options)

Command 类的 __call__函数:

    # Python 实用宝典
    # https://pythondict.com
    
    def __call__(self, *args, **kwargs):
        random.seed()  # maybe we were forked.
        self.verify_args(args)
        try:
            ret = self.run(*args, **kwargs)
            return ret if ret is not None else EX_OK
        except self.UsageError as exc:
            self.on_usage_error(exc)
            return exc.status
        except self.Error as exc:
            self.on_error(exc)
            return exc.status

可见,在该函数中会调用到run方法,此时调用的run方法就是beat类中重写的run方法,查看该方法:

# Python 实用宝典
# https://pythondict.com
    
class beat(Command):
    """Start the beat periodic task scheduler.

    Examples::

        celery beat -l info
        celery beat -s /var/run/celery/beat-schedule --detach
        celery beat -S djcelery.schedulers.DatabaseScheduler

    """
    doc = __doc__
    enable_config_from_cmdline = True
    supports_args = False

    def run(self, detach=False, logfile=None, pidfile=None, uid=None,
            gid=None, umask=None, working_directory=None, **kwargs):
        # 是否开启后台运行
        if not detach:
            maybe_drop_privileges(uid=uid, gid=gid)
        workdir = working_directory
        kwargs.pop('app', None)
        # 设定偏函数
        beat = partial(self.app.Beat,
                       logfile=logfile, pidfile=pidfile, **kwargs)

        if detach:
            with detached(logfile, pidfile, uid, gid, umask, workdir):
                return beat().run() # 后台运行
        else:
            return beat().run() # 立即运行

这里引用了偏函数的知识,偏函数就是从基函数创建一个新的带默认参数的函数,详细可见廖雪峰老师的介绍:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017454145929440

可见,此时创建了app的Beat方法的偏函数,并通过 .run 函数执行启动 beat 进程,首先看看这个 beat 方法:

    # Python 实用宝典
    # https://pythondict.com
    @cached_property
    def Beat(self, **kwargs):
        # 导入celery.apps.beat:Beat类
        return self.subclass_with_self('celery.apps.beat:Beat')

可以看到此时就实例化了 celery.apps.beat 中的 Beat 类,并调用了该实例的 run 方法:

    # Python 实用宝典
    # https://pythondict.com
    def run(self):
        print(str(self.colored.cyan(
            'celery beat v{0} is starting.'.format(VERSION_BANNER))))
        # 初始化loader
        self.init_loader()
        # 设置进程
        self.set_process_title()
        # 开启任务调度
        self.start_scheduler()

init_loader 中,会导入默认的modules,此时会引入相关的定时任务,这些不是本文重点。我们重点看 start_scheduler 是如何开启任务调度的:

    # Python 实用宝典
    # https://pythondict.com
    def start_scheduler(self):
        c = self.colored
        if self.pidfile: # 是否设定了pid文件
            platforms.create_pidlock(self.pidfile)  # 创建pid文件
        # 初始化service
        beat = self.Service(app=self.app,
                            max_interval=self.max_interval,
                            scheduler_cls=self.scheduler_cls,
                            schedule_filename=self.schedule)
        
        # 打印启动信息
        print(str(c.blue('__    ', c.magenta('-'),
                  c.blue('    ... __   '), c.magenta('-'),
                  c.blue('        _\n'),
                  c.reset(self.startup_info(beat)))))
        # 开启日志
        self.setup_logging()
        if self.socket_timeout:
            logger.debug('Setting default socket timeout to %r',
                         self.socket_timeout)
            # 设置超时
            socket.setdefaulttimeout(self.socket_timeout)
        try:
            # 注册handler
            self.install_sync_handler(beat)
            # 开启beat
            beat.start()
        except Exception as exc:
            logger.critical('beat raised exception %s: %r',
                            exc.__class__, exc,
                            exc_info=True)

我们看下beat是如何开启的:

    # Python 实用宝典
    # https://pythondict.com
    def start(self, embedded_process=False, drift=-0.010):
        info('beat: Starting...')
        # 打印最大间隔时间
        debug('beat: Ticking with max interval->%s',
              humanize_seconds(self.scheduler.max_interval))
        
        # 通知注册该signal的函数
        signals.beat_init.send(sender=self)
        if embedded_process:
            signals.beat_embedded_init.send(sender=self)
            platforms.set_process_title('celery beat')

        try:
            while not self._is_shutdown.is_set():
                # 调用scheduler.tick()函数检查还剩多余时间
                interval = self.scheduler.tick()
                interval = interval + drift if interval else interval
                # 如果大于0
                if interval and interval > 0:
                    debug('beat: Waking up %s.',
                          humanize_seconds(interval, prefix='in '))
                    # 休眠
                    time.sleep(interval)
                    if self.scheduler.should_sync():
                        self.scheduler._do_sync()
        except (KeyboardInterrupt, SystemExit):
            self._is_shutdown.set()
        finally:
            self.sync()

这里重点看 self.scheduler.tick() 方法:

    # Python 实用宝典
    # https://pythondict.com
    def tick(self):
        """Run a tick, that is one iteration of the scheduler.

        Executes all due tasks.

        """
        remaining_times = []
        try:
            # 遍历每个周期任务设定
            for entry in values(self.schedule):
                # 下次运行时间
                next_time_to_run = self.maybe_due(entry, self.publisher)
                if next_time_to_run:
                    remaining_times.append(next_time_to_run)
        except RuntimeError:
            pass

        return min(remaining_times + [self.max_interval])

这里通过 self.schedule 拿到了所有存放在用 shelve 写入的 celerybeat-schedule 文件的定时任务,遍历所有定时任务,调用 self.maybe_due 方法:

    # Python 实用宝典
    # https://pythondict.com
    def maybe_due(self, entry, publisher=None):
        # 是否到达运行时间
        is_due, next_time_to_run = entry.is_due()

        if is_due:
            # 打印任务发送日志
            info('Scheduler: Sending due task %s (%s)', entry.name, entry.task)
            try:
                # 执行任务
                result = self.apply_async(entry, publisher=publisher)
            except Exception as exc:
                error('Message Error: %s\n%s',
                      exc, traceback.format_stack(), exc_info=True)
            else:
                debug('%s sent. id->%s', entry.task, result.id)
        return next_time_to_run

可以看到,此处会判断任务是否到达定时时间,如果是的话,会调用 apply_async 调用Worker执行任务。如果不是,则返回下次运行时间,让 Beat 进程进行 Sleep,减少进程资源消耗。

到此,我们就讲解完了 Celery Beat 在周期定时任务的检测调度机制,怎么样,小伙伴们有没有什么疑惑?可以在下方留言区留言一起讨论哦。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

太酷炫了,我用python画出了北上广深的地铁路线动态图

今天教大家用python制作北上广深——地铁线路动态图,这可能是全网最全最详细的教程了。

坐标点的采集

小五之前做过类似的地理可视化,不过都是使用网络上收集到的json数据。但很多数据其实是过时的,甚至是错误/不全的。所以我们最好还是要自己动手,丰衣足食(爬虫大法好)。

打开高德地图的地铁网页,http://map.amap.com/subway/index.html?&1100

可以轻松得到北京地铁数据的接口,同理也把其他三个城市的url复制出来。

有了api,解析json即可获得数据👇

url = 'http://map.amap.com/service/subway?_1615466846985&srhdata=1100_drw_beijing.json'
response = requests.get(url)
result = json.loads(response.text)
stations = []
for i in result['l']:
    station = []
    for a in i['st']:
        station.append([float(b) for b in a['sl'].split(',')])
    stations.append(station)
pprint.pprint(stations)

pprint格式化打印结果,方便预览

坐标系的转换

其实我之前有看到类似地理可视化文章,结果自己一试发现缩小看还行,一放大就会发现坐标点飘出二里地了😂

正好拿上文获取的坐标点给大家演示一下,看看同样的经纬度在不同地图里的地理位置👇

👆可以看到该经纬度在高德地图里指的是金安桥地铁站,然而在百度地图里,地理位置则指向了几公里外的某大厦。

为什么会出现这个问题呢?

其实是不同地图产品的地理坐标系导致的。

下面说一下常见的地理坐标系:地球坐标系是国际通用坐标系,比较适合国际地图可视化。不过在我国范围内,一般不会直接使用它,而是使用由国家测绘局在其基础上加密的火星坐标系。另外还有公司会在火星坐标系上进行二次加密,比如百度坐标系、搜狗坐标系等。

我网上找到了一张图,来自知乎@师大Giser[1]👇

上图可以作为参考,具体原因我们就不细究了。重点是什么,如何利用python转换坐标系?

例如在本文中,我们是在高德地图中获得的坐标点集合,那么也就是使用的是GCJ-02坐标系。而下文可视化中会调用百度地图的接口,也就是需要在BD-09坐标系中进行可视化。

幸好我在网上搜到了GCJ-02BD-09的公式,并用python实现此公式:

#需要的两个常量先设置好
pi = 3.1415926535897932384 
r_pi = pi * 3000.0/180.0

def gcj02_bd09(lon_gcj02,lat_gcj02):
    b = math.sqrt(lon_gcj02 * lon_gcj02 + lat_gcj02 * lat_gcj02) + 0.00002 * math.sin(lat_gcj02 * r_pi)
    o = math.atan2(lat_gcj02 , lon_gcj02) + 0.000003 * math.cos(lon_gcj02 * r_pi)
    lon_bd09 = b * math.cos(o) + 0.0065
    lat_bd09 = b * math.sin(o) + 0.006
    return [lon_bd09,lat_bd09]

这样我们就写好了一个python将GCJ-02坐标系转成BD-09的函数,调用这个函数,就可以将高德地图获取的坐标点集合统统转换成百度坐标系。

result = []
for station in stations:
    result.append([gcj02_bd09(*point) for point in station])

以其中一个坐标点为例:

到此,我们的前期数据工作终于准备齐了。

当然,如果我们一开始获取的数据就是BD_09(百度地图)坐标系的,转换这步就可以直接省略喽~

地理可视化

接下来就要利用pyecharts中的BMap来可视化了,不过需要先获取百度开放平台的密钥。

百度地图开放平台👉http://lbsyun.baidu.com/apiconsole/key#/home

登录百度账户,查看应用管理-我的应用。点击创建应用,全部默认随便创建。

复制👆上图中的访问应用(AK),保存好,这在后续的可视化中将要用到。

我们使用pyecharts中的BMap,先导入模块

from pyecharts.charts import BMap 
from pyecharts import options as opts 
from pyecharts.globals import BMapType, ChartType 

在导入数据(也就是上文转换后的经纬度数据result)后,可以调整一下参数以及增添一些控件。

👇关键参数都做了注释,方便大家查看(其中百度appkey记得替换成自己的)

map_b = (
    BMap(init_opts = opts.InitOpts(width = "800px", height = "600px"))
    .add_schema(
        baidu_ak = '****************'#百度地图开发应用appkey
        center = [116.40396339.915119], #当前视角的中心点
        zoom = 10#当前视角的缩放比例
        is_roam = True#开启鼠标缩放和平移漫游
    )
    .add(
        series_name = "",
        type_ = ChartType.LINES, #设置Geo图类型
        data_pair = result, #数据项
        is_polyline = True#是否是多段线,在画lines图情况下#
        linestyle_opts = opts.LineStyleOpts(color = "blue", opacity = 0.5, width = 1), # 线样式配置项
    )
    .add_control_panel(
        maptype_control_opts = opts.BMapTypeControlOpts(type_ = BMapType.MAPTYPE_CONTROL_DROPDOWN), #切换地图类型的控件
        scale_control_opts = opts.BMapScaleControlOpts(), #比例尺控件
        overview_map_opts = opts.BMapOverviewMapControlOpts(is_open = True), #添加缩略地图
        navigation_control_opts = opts.BMapNavigationControlOpts() #地图的平移缩放控件
    )
)

map_b.render(path = 'subway_beijing.html')

注:因为是北京地图,所以设置天安门的经纬度[116.403963, 39.915119]为视角中心。

让我们看一下可视化的结果吧:

👆上图中的四个角都有控件,这是我们在代码中添加了控件参数,它们分别为:地图的平移缩放控件、切换地图类型的控件、缩略地图、以及比例尺控件。

是不是还阔以

其他效果展示

上文已经基本实现了用python制作地铁线路动态图。不过大家都用同一种颜色背景制作动态图的话,就显得就太单调了。

正好我们还要绘制其他三个城市的地铁图,那就调整一些参数,看看能获得什么效果吧?

上海-变色

上海的数据接口是:

http://map.amap.com/service/subway?_1615467204533&srhdata=3100_drw_shanghai.json

上海市的地铁图我们改一下line的颜色,可在参数linestyle_opts中修改color。

👇下图中的线条颜色是lilac——浅紫色

广州-卫星图

广州的数据接口是:

http://map.amap.com/service/subway?_1615494419554&srhdata=4401_drw_guangzhou.json

其实我们还可以调整可视化背景为卫星图。不过这一操作并不需要额外写代码,因为刚刚上文提到我在调整参数时添加了4个控件,其中右上角的就可以直接切换地图类型,具体操作见下图。

深圳-个性化配色

深圳的数据接口是:

http://map.amap.com/service/subway?_1615494473615&srhdata=4403_drw_shenzhen.json

如果不满意百度地图设置好的地图背景,我们还可以个性化设置mapStyle,调整自己的配色styleJson

下图就是小五参考网上公开的配色方案制作的,大家也可以用来参考https://blog.csdn.net/weixin_41290949/article/details/106379134[2]

小结

今天带大家学习了如何利用python绘制一线城市的地铁线路动图。

主要分为四个部分:坐标点的采集、坐标系的转换、利用pyecharts地理可视化、其他效果展示。

如果你读完本文觉得有收获,希望可以给文章右下角点个赞👍

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

点击下方阅读原文可获得更好的阅读体验

Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

HelloGitHub-分享GitHub上有趣、入门级的开源项目

中文|English

分享GitHub上有趣、入门级的开源项目.
兴趣是最好的老师,这里能够帮你找到编程的兴趣!




简介

你好GitHub分享GitHub上有趣、入门级的开源项目。每月28号以月刊的形式更新发布,内容包括:有趣、入门级的开源项目开源书籍实战项目企业级项目等,让你用很短时间感受到开源的魅力,爱上开源!

内容

获得更好的阅读体验官网HelloGitHub 公众号那就是。

📇 🎃 🍺 🍥
第 63 期 第 62 期 第 61 期
第 60 期 第 59 期 第 58 期 第 57 期 第 56 期
第 55 期 第 54 期 第 53 期 第 52 期 第 51 期
第 50 期 第 49 期 第 48 期 第 47 期 第 46 期
第 45 期 第 44 期 第 43 期 第 42 期 第 41 期
第 40 期 第 39 期 第 38 期 第 37 期 第 36 期
第 35 期 第 34 期 第 33 期 第 32 期 第 31 期
第 30 期 第 29 期 第 28 期 第 27 期 第 26 期
第 25 期 第 24 期 第 23 期 第 22 期 第 21 期
第 20 期 第 19 期 第 18 期 第 17 期 第 16 期
第 15 期 第 14 期 第 13 期 第 12 期 第 11 期
第 10 期 第 09 期 第 08 期 第 07 期 第 06 期
第 05 期 第 04 期 第 03 期 第 02 期 第 01 期

欢迎推荐或自荐项目成为HelloGitHub贡献者

赞助



云主机
仅 6 元/月


CDN
开启全网加速

声明


本作品采用署名-非商业性使用-禁止演绎 4.0 国际进行许可.

Leetcode题解,记录自己的LeetCode解题之路

仓库介绍

leetcode题解,记录自己的leetcode解题之路。

本仓库目前分为五个部分:

  • 第一个部分是leetcode经典题目的解析,包括思路,关键点和具体的代码实现.
  • 第二部分是对于数据结构与算法的总结
  • 第三部分是anki卡片,将leetcode题目按照一定的方式记录在anki中,方便大家记忆.
  • 第四部分是每日一题,每日一题是在交流群(包括微信和QQ)里进行的一种活动,大家一起解一道题,这样讨论问题更加集中,会得到更多的反馈。而且这些题目可以被记录下来,日后会进行筛选添加到仓库的题解模块.
  • 第五部分是计划,这里会记录将来要加入到以上三个部分内容

🍖仓库食用指南

  • 这里有一张互联网公司面试中经常考察的问题类型总结的思维导图,我们可以结合图片中的信息分析一下.

(图片来自LeetCode)

其中算法,主要是以下几种:

  • 基础技巧:分治、二分、贪心
  • 排序算法:快速排序、归并排序、计数排序
  • 搜索算法:回溯、递归、深度优先遍历,广度优先遍历,二叉搜索树等
  • 图论:最短路径、最小生成树
  • 动态规划:背包问题、最长子序列

数据结构,主要有如下几种:

  • 数组与链表:单/双向链表
  • 栈与队列
  • 哈希表
  • 堆:最大堆/最小堆
  • 树与图:最近公共祖先、并查集
  • 字符串:前缀树(字典树)/后缀树

数据结构与算法的总结

精选题解

💻插件

或许是一个可以改变你刷题效率的浏览器扩展插件.

插件地址:https://chrome.google.com/webstore/detail/leetcode-cheatsheet/fniccleejlofifaakbgppmbbcdfjonle?hl=en-US。

不能访问谷歌商店的朋友可以去我的公众号回复插件获取离线版.强烈推荐大家使用谷歌商店安装,这样如果有更新可以自动安装,毕竟咱们的插件更新还是蛮快的.

❗怎么刷LeetCode?

LEETCODE经典题目的解析(200多道)

这里仅列举具有代表性题目,并不是全部题目

目前更新了200多道题解,加上专题涉及的题目,差不多有300道那就是。

简单难度题目合集

这里的题目难度比较小,大多是模拟题,或者是很容易看出解法的题目,另外简单题目一般使用暴力法都是可以解决的.这个时候只有看一下数据范围,思考下你的算法复杂度就行了.

当然也不排除很多Hard题目也可以暴力模拟,大家平时多注意数据范围即可。

以下是我列举的经典题目(带91字样的表示出自91天学算法(活动):

中等难度题目合集

中等题目是力扣比例最大的部分,因此这部分我的题解也是最多的.大家不要太过追求难题,先把中等难度题目做熟了再说.

这部分的题目要不需要我们挖掘题目的内含信息,将其抽象成简单题目.要么是一些写起来比较麻烦的题目,一些人编码能力不行就挂了.因此大家一定要自己做,即使看了题解“会了”,也要自己码一遍.自己不亲自写一遍,里面的细节永远不知道.

以下是我列举的经典题目(带91字样的表示出自91天学算法(活动):

困难难度题目合集

困难难度题目从类型上说多是:

  • 设计题
  • 游戏场景题目
  • 中等题目的跟进

从解法上来说,多是:

  • 图算法
  • 动态规划
  • 二分法
  • DFS和BFS
  • 状态压缩
  • 剪枝

从逻辑上说,要么就是非常难想到,要么就是非常难写代码.这里我总结了几个技巧:

  1. 看题目的数据范围,看能否暴力模拟
  2. 暴力枚举所有可能的算法往上套,比如图的题目.
  3. 总结和记忆解题模板,减少解题压力

以下是我列举的经典题目(带91字样的表示出自91天学算法(活动):

🔱*Anki卡片

我是Anki主要分为两个部分:一部分是关键点到题目的映射,另一部分是题目到思路,关键点,代码的映射。

全部卡片都在anki-card

使用方法:

Anki-文件-导入-下拉格式选择“打包的anki集合”,然后选中你下载好的文件,确定即可.

更多关于Anki使用方法的请查看anki 官网

(目前已更新卡片一览(仅列举正面):

  • 二分法解决问题的关键点是什么,相关问题有哪些?
  • 如何用栈的特点来简化操作,涉及到的题目有哪些?
  • 双指针问题的思路以及相关题目有哪些?
  • 滑动窗口问题的思路以及相关题目有哪些?
  • 回溯法解题的思路以及相关题目有哪些?
  • 数论解决问题的关键点是什么,相关问题有哪些?
  • 位运算解决问题的关键点是什么,相关问题有哪些?

已加入的题目有:#2#3#11

📈大事件

  • 2021-02-23:STAR破四万

💝贡献

  • 如果有想法和创意,请提issue或者进群提
  • 如果想贡献增加题解或者翻译,可以参考贡献指南

    关于如何提交题解,我写了一份指南

  • 如果需要修改项目中图片这里存放了项目中绘制图的源代码,大家可以用draw.io打开进行编辑.

💌鸣谢

感谢为这个项目作出贡献的所有小伙伴

许可证

CC BY-NC-ND 4.0

Scrapy-SCRAPPY,一种用于Python的快速高级Web抓取框架

概述

SCRAPPY是一个快速的高级Web爬行和Web抓取框架,用于爬行网站并从其页面中提取结构化数据。它可以用于广泛的目的,从数据挖掘到监控和自动化测试

Scrrapy由Zyte(前身为ScrapingHub)和many other
contributors

请查看Scrapy主页,网址为https://scrapy.org有关详细信息,包括功能列表

要求

  • Python 3.6+
  • 可在Linux、Windows、MacOS、BSD上运行

安装

快捷方式:

pip install scrapy

请参阅文档中的安装部分,网址为https://docs.scrapy.org/en/latest/intro/install.html有关更多详细信息,请参阅

文档

文档在线提供,网址为https://docs.scrapy.org/而在docs目录

发布版本

你可以查一下https://docs.scrapy.org/en/latest/news.html有关发行说明,请参阅

社区(博客、Twitter、邮件列表、IRC)

看见https://scrapy.org/community/有关详细信息,请参阅

贡献

看见https://docs.scrapy.org/en/master/contributing.html有关详细信息,请参阅

行为规范

请注意,此项目随贡献者行为准则一起发布(请参阅https://github.com/scrapy/scrapy/blob/master/CODE_OF_CONDUCT.md)

通过参与此项目,您同意遵守其条款。请将不可接受的行为报告给opensource@zyte.com

使用Scrapy的公司

看见https://scrapy.org/companies/查看列表

商业支持

看见https://scrapy.org/support/有关详细信息,请参阅

TensorFlow-Examples-TensorFlow初学者教程和示例(支持TF v1和v2)

TensorFlow示例

本教程旨在通过示例轻松深入TensorFlow。为了可读性,它包括笔记本和带有说明的源代码,适用于TFv1和v2

它适合那些想要找到关于TensorFlow的清晰简明示例的初学者。除了传统的“原始”TensorFlow实现之外,您还可以找到最新的TensorFlow API实践(例如layersestimatordataset、.)

更新(05/16/2020):将所有默认示例移动到TF2。对于TF v1示例:check here

教程索引

0-必备条件

1-简介

  • 你好,世界(notebook)。非常简单的示例,学习如何使用TensorFlow2.0+打印“hello world”
  • 基本操作(notebook)。一个涵盖TensorFlow 2.0+基本操作的简单示例

2-基本型号

  • 线性回归(notebook)。用TensorFlow 2.0+实现线性回归
  • Logistic回归(notebook)。用TensorFlow 2.0+实现Logistic回归
  • word2vec(单词嵌入)(notebook)。使用TensorFlow 2.0+从维基百科数据构建单词嵌入模型(Word2vec)
  • GBDT(梯度增强决策树)(notebooks)。使用TensorFlow 2.0+实现梯度增强决策树,以使用波士顿住房数据集预测房价

3-神经网络

受监督
  • 简单神经网络(notebook)。使用TensorFlow 2.0‘Layers’和‘Model’API构建一个简单的神经网络来对MNIST数字数据集进行分类
  • 简单神经网络(低级)(notebook)。MNIST数字数据集分类的简单神经网络RAW实现
  • 卷积神经网络(notebook)。使用TensorFlow 2.0+“Layers”和“model”API构建卷积神经网络对MNIST数字数据集进行分类
  • 卷积神经网络(低级)(notebook)。卷积神经网络对MNIST数字数据集分类的原始实现
  • 递归神经网络(LSTM)(notebook)。利用TensorFlow 2.0‘Layers’和‘Model’API构建递归神经网络(LSTM)对MNIST数字数据集进行分类
  • 双向递归神经网络(LSTM)(notebook)。利用TensorFlow 2.0+‘Layers’和‘Model’API构建双向递归神经网络(LSTM)对MNIST数字数据集进行分类
  • 动态递归神经网络(LSTM)(notebook)。使用TensorFlow 2.0+‘Layers’和‘Model’API构建一个执行动态计算的递归神经网络(LSTM),对可变长度的序列进行分类
无人监督
  • 自动编码器(notebook)。构建一个自动编码器,将图像编码到较低的维度并重建它
  • DCGAN(深度卷积生成对抗网络)(notebook)。构建深度卷积生成对抗网络(DCGAN)从噪声中生成图像

4-实用程序

  • 保存和恢复模型(notebook)。使用TensorFlow 2.0+保存和恢复模型
  • 构建自定义图层和模块(notebook)。了解如何构建自己的层/模块并将其集成到TensorFlow 2.0+模型中
  • 电路板(notebook)。使用TensorFlow 2.0+Ttensorboard跟踪和可视化神经网络计算图形、指标、权重等

5-数据管理

  • 加载和解析数据(notebook)。使用TensorFlow 2.0(Numpy阵列、图像、CSV文件、自定义数据)构建高效的数据管道。
  • 生成并加载TFRecords(notebook)。将数据转换为TFRecords格式,并使用TensorFlow 2.0+进行加载
  • 图像变换(即图像放大)(notebook)。使用TensorFlow 2.0+应用各种图像增强技术,生成用于训练的失真图像

6-硬件

  • 多GPU培训(notebook)。在CIFAR-10数据集上用多GPU训练卷积神经网络

TensorFlow v1

此处提供了TF v1的教程索引:TensorFlow v1.15 Examples或参见下面的示例列表

数据集

某些示例需要MNIST数据集来进行训练和测试。别担心,运行示例时会自动下载此数据集。MNIST是一个手写数字数据库,要快速描述该数据集,您可以查看this notebook

官网:http://yann.lecun.com/exdb/mnist/

安装

要下载所有示例,只需克隆此存储库:

git clone https://github.com/aymericdamien/TensorFlow-Examples

要运行它们,您还需要最新版本的TensorFlow。要安装它,请执行以下操作:

pip install tensorflow

或者(有GPU支持):

pip install tensorflow_gpu

有关TensorFlow安装的更多详细信息,可以查看TensorFlow Installation Guide

TensorFlow v1示例-索引

此处提供了TF v1的教程索引:TensorFlow v1.15 Examples

0-必备条件

1-简介

  • 你好,世界(notebook)(code)。学习如何使用TensorFlow打印“hello world”的非常简单的示例
  • 基本操作(notebook)(code)。介绍TensorFlow基本操作的简单示例
  • TensorFlow急切API基础知识(notebook)(code)。开始使用TensorFlow急切的API

2-基本型号

  • 线性回归(notebook)(code)。用TensorFlow实现线性回归
  • 线性回归(EAGER API)(notebook)(code)。使用TensorFlow的Eager API实现线性回归
  • Logistic回归(notebook)(code)。用TensorFlow实现Logistic回归
  • Logistic回归(EAGER API)(notebook)(code)。使用TensorFlow的Eager API实现Logistic回归
  • 最近邻居(notebook)(code)。用TensorFlow实现最近邻算法
  • K-均值(notebook)(code)。用TensorFlow构建K-Means分类器
  • 随机森林(notebook)(code)。用TensorFlow构建随机森林分类器
  • 梯度增强决策树(GBDT)(notebook)(code)。用TensorFlow构建梯度增强决策树(GBDT)
  • word2vec(单词嵌入)(notebook)(code)。使用TensorFlow从维基百科数据构建单词嵌入模型(word2vec

3-神经网络

受监督
  • 简单神经网络(notebook)(code)。建立一个简单的神经网络(也称为多层感知器)来对MNIST数字数据集进行分类。原始TensorFlow实现
  • 简单神经网络(tf.layer/估计器API)(notebook)(code)。使用TensorFlow‘Layers’和‘Estiator’API构建一个简单的神经网络(也称为多层感知器)来对MNIST数字数据集进行分类
  • 简单神经网络(EAGER API)(notebook)(code)。使用TensorFlow EAGER API构建简单的神经网络(也称为多层感知器)对MNIST数字数据集进行分类
  • 卷积神经网络(notebook)(code)。构建卷积神经网络对MNIST数字数据集进行分类。原始TensorFlow实现
  • 卷积神经网络(tf.layer/估计器API)(notebook)(code)。使用TensorFlow‘Layers’和‘Estiator’API构建卷积神经网络对MNIST数字数据集进行分类
  • 递归神经网络(LSTM)(notebook)(code)。构建递归神经网络(LSTM)对MNIST数字数据集进行分类
  • 双向递归神经网络(LSTM)(notebook)(code)。构建双向递归神经网络(LSTM)对MNIST数字数据集进行分类
  • 动态递归神经网络(LSTM)(notebook)(code)。建立递归神经网络(LSTM)进行动态计算,对不同长度的序列进行分类
无人监督
  • 自动编码器(notebook)(code)。构建一个自动编码器,将图像编码到较低的维度并重建它
  • 变分自动编码器(notebook)(code)。构建一个变分自动编码器(VAE),对噪声进行编码并生成图像
  • 生成性对抗性网络(GAN)(notebook)(code)。构建生成性对抗网络(GAN),从噪声中生成图像
  • DCGAN(深度卷积生成对抗网络)(notebook)(code)。构建深度卷积生成对抗网络(DCGAN)从噪声中生成图像

4-实用程序

  • 保存和恢复模型(notebook)(code)。使用TensorFlow保存和恢复模型
  • Tensorboard-图形和损耗可视化(notebook)(code)。使用Tensorboard可视化计算图形并绘制损耗
  • 触摸板-高级可视化(notebook)(code)。深入Tensorboard;可视化变量、渐变等

5-数据管理

  • 构建图像数据集(notebook)(code)。使用TensorFlow数据队列从图像文件夹或数据集文件构建您自己的图像数据集
  • TensorFlow数据集API(notebook)(code)。引入TensorFlow数据集API优化输入数据管道
  • 加载和解析数据(notebook)。构建高效的数据管道(Numpy数组、图像、CSV文件、自定义数据等)
  • 生成并加载TFRecords(notebook)。将数据转换为TFRecords格式,并加载
  • 图像变换(即图像放大)(notebook)。应用各种图像增强技术,生成用于训练的失真图像

6-多GPU

  • 多GPU上的基本操作(notebook)(code)。在TensorFlow中引入多GPU的一个简单示例
  • 在多GPU上训练神经网络(notebook)(code)。一种简单明了的TensorFlow在多GPU上训练卷积神经网络的实现

更多例子

以下示例来自TFLearn,一个为TensorFlow提供简化接口的库。你可以看看,有很多examplespre-built operations and layers

教程

  • TFLearn Quickstart通过一个具体的机器学习任务学习TFLearn的基础知识。构建和训练深度神经网络分类器

示例

Face_recognition-世界上最简单的Python和命令行面部识别API

人脸识别

您还可以阅读此文件的翻译版本in Chinese 简体中文版in Korean 한국어in Japanese 日本語

使用世界上最简单的人脸识别库从Python或命令行识别和操作人脸

使用以下方式构建dlib基于深度学习的最先进的人脸识别技术。该模型在人脸识别系统上的准确率为99.38%。Labeled Faces in the Wild基准测试

这也提供了一个简单的face_recognition命令行工具,可以让你从命令行对图像文件夹进行人脸识别!

功能

在图片中查找面孔

查找图片中出现的所有面孔:

import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)

查找和操作图片中的面部特征

获取每个人眼睛、鼻子、嘴巴和下巴的位置和轮廓

import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

找到面部特征对很多重要的东西都非常有用。但是你也可以用它来做一些非常愚蠢的事情,比如申请digital make-up(想想“美图”):

识别图片中的面孔

识别每张照片中出现的人

import face_recognition
known_image = face_recognition.load_image_file("biden.jpg")
unknown_image = face_recognition.load_image_file("unknown.jpg")

biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

results = face_recognition.compare_faces([biden_encoding], unknown_encoding)

您甚至可以将此库与其他Python库配合使用,以进行实时人脸识别:

看见this example以获取代码

在线演示

用户贡献的共享Jupyter笔记本演示(不受官方支持):

安装

要求

  • Python 3.3+或Python 2.7
  • MacOS或Linux(Windows不受官方支持,但可能可以使用)

安装选项:

在Mac或Linux上安装

首先,确保已经安装了带有Python绑定的dlib:

然后,确保您安装了cmake:

brew install cmake

最后,使用以下命令从pypi安装此模块pip3(或pip2对于Python 2):

pip3 install face_recognition

或者,您可以使用以下命令尝试此库Docker,请参见this section

如果您在安装时遇到问题,您还可以尝试使用pre-configured VM

安装在NVIDIA Jetson纳米板上

  • Jetson Nano installation instructions
    • 请仔细按照文章中的说明操作。Jetson Nano上的CUDA库中当前存在一个错误,如果您不按照本文中的说明注释掉dlib中的一行并重新编译它,该库将会静默失败

在树莓PI 2+上安装

在FreeBSD上安装

pkg install graphics/py-face_recognition

在Windows上安装

虽然Windows不受官方支持,但有帮助的用户已经发布了如何安装该库的说明:

安装预配置的虚拟机映像

用法

命令行界面

当您安装时face_recognition,您会得到两个简单的命令行程序:

  • face_recognition-识别照片中的面孔或装满照片的文件夹
  • face_detection-在照片或装满照片的文件夹中查找面孔

face_recognition命令行工具

这个face_recognition命令使您可以识别照片中的面孔或已满的文件夹中的照片

首先,您需要提供一个文件夹,其中包含您已经认识的每个人的一张照片。每个人都应该有一个图像文件,这些文件根据图片中的人命名:

接下来,您需要第二个文件夹,其中包含要标识的文件:

然后,您只需在中运行命令face_recognition,传入已知人员的文件夹和包含未知人员的文件夹(或单个图像),它会告诉您每个图像中有哪些人:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

每个面的输出中都有一行。数据用逗号分隔,其中包含文件名和找到的人员的姓名

一个unknown_person图像中的面孔与您的已知人员文件夹中的任何人都不匹配

face_detection命令行工具

这个face_detection命令允许您查找图像中任何面的位置(像素坐标

只需运行该命令face_detection,传入要检查的图像文件夹(或单个图像):

$ face_detection  ./folder_with_pictures/

examples/image1.jpg,65,215,169,112
examples/image2.jpg,62,394,211,244
examples/image2.jpg,95,941,244,792

它为检测到的每个面打印一行。报告的坐标是面的上、右、下和左坐标(以像素为单位)

调整公差/灵敏度

如果同一个人有多个匹配项,则照片中的人可能看起来非常相似,需要较低的容差值才能更严格地进行面部比较

您可以使用--tolerance参数。默认公差值为0.6,较小的数字会使面比较更加严格:

$ face_recognition --tolerance 0.54 ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

如果要查看为每个匹配计算的面距离以调整容差设置,可以使用--show-distance true

$ face_recognition --show-distance true ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama,0.378542298956785
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person,None
更多例子

如果您只想知道每张照片中人物的名字,而不关心文件名,您可以这样做:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2

Barack Obama
unknown_person
提高人脸识别速度

如果您的计算机具有多个CPU内核,则可以并行进行人脸识别。例如,如果您的系统有4个CPU核心,通过并行使用所有CPU核心,您可以在相同的时间内处理大约4倍的图像

如果您使用的是Python 3.4或更高版本,请传入--cpus <number_of_cpu_cores_to_use>参数:

$ face_recognition --cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/

您也可以传入--cpus -1要使用系统中的所有CPU核心,请执行以下操作

Python模块

您可以导入face_recognition模块,然后只需几行代码就可以轻松地操作面。超级简单!

接口文档:https://face-recognition.readthedocs.io

自动查找图像中的所有人脸
import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image)

# face_locations is now an array listing the co-ordinates of each face!

看见this example试试看

您还可以选择采用稍微更精确的基于深度学习的人脸检测模型

注:这款机型需要GPU加速(通过NVIDIA的CUDA库)才能获得良好的性能。编译时还需要启用CUDA支持dlib

import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image, model="cnn")

# face_locations is now an array listing the co-ordinates of each face!

看见this example试试看

如果您有大量图像和GPU,您还可以find faces in batches

自动定位图像中人的面部特征
import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

# face_landmarks_list is now an array with the locations of each facial feature in each face.
# face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye.

看见this example试试看

识别图像中的人脸并识别他们是谁
import face_recognition

picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face!

unknown_picture = face_recognition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]

# Now we can see the two face encodings are of the same person with `compare_faces`!

results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)

if results[0] == True:
    print("It's a picture of me!")
else:
    print("It's not a picture of me!")

看见this example试试看

Python代码示例

所有的例子都是可用的here

人脸检测

面部特征

面部识别

创建独立的可执行文件

如果要创建无需安装即可运行的独立可执行文件pythonface_recognition,您可以使用PyInstaller但是,它需要一些自定义配置才能与该库一起使用。看见this issue关于如何做这件事

涵盖以下内容的文章和指南face_recognition

人脸识别的工作原理

如果您想了解人脸定位和识别如何工作,而不是依赖于黑匣子库,read my article

注意事项

  • 人脸识别模型是在成人身上训练的,在儿童身上效果不是很好。如果使用默认的比较阈值0.6,它往往很容易混淆孩子
  • 不同民族的准确度可能会有所不同。请看this wiki page有关更多详细信息,请参阅

Deployment to Cloud Hosts (Heroku, AWS, etc)

因为face_recognition取决于dlib它是用C++编写的,因此将使用它的应用程序部署到Heroku或AWS等云主机提供商可能会很棘手

为了简单起见,此repo中有一个示例Dockerfile,它展示了如何运行用face_recognition在一个Docker集装箱。这样,您就应该能够部署到任何支持Docker映像的服务

您可以通过运行以下命令在本地试用Docker镜像:docker-compose up --build

还有一些several prebuilt Docker images.

具有图形处理器的linux用户(驱动程序>=384.81)和Nvidia-Docker可以在GPU上运行该示例:打开docker-compose.yml文件并取消注释dockerfile: Dockerfile.gpuruntime: nvidia线条

有问题吗?

如果您遇到问题,请阅读Common Errors在提交GitHub问题之前,请访问维基百科

谢谢

  • 非常,非常感谢Davis King(@nulhom)用于创建dlib,并用于提供在该库中使用的经过训练的面部特征检测和面部编码模型。有关支持面部编码的ResNet的更多信息,请查看他的blog post
  • 感谢所有致力于所有出色的Python数据科学库(如Numpy、Scipy、SCRICKIT-IMAGE、Pillow等)的人,正是这些库使这类事情在Python中变得如此简单和有趣
  • 感谢Cookiecutter以及audreyr/cookiecutter-pypackage一种使Python工程打包方式更具容忍性的工程模板

Superset-Apache Superset是一个数据可视化和数据探索平台

现代的、企业就绪的商业智能Web应用程序

为什么是超集?

超集提供:

  • 用于可视化数据集和制作交互式仪表板的直观界面
  • 一系列精美的可视化效果,可展示您的数据
  • 用于提取和显示数据集的无代码可视化构建器
  • 世界级的SQL IDE,用于准备用于可视化的数据,包括丰富的元数据浏览器
  • 轻量级语义层,使数据分析师能够快速定义自定义维度和指标
  • 对大多数SQL语言数据库的开箱即用支持
  • 无缝的内存中异步缓存和查询
  • 一种可扩展的安全模型,允许配置关于谁可以访问哪些产品功能和数据集的非常复杂的规则
  • 与主要身份验证后端(数据库、OpenID、LDAP、OAUTH、REMOTE_USER等)集成
  • 能够添加自定义可视化插件
  • 用于编程自定义的API
  • 从头开始为规模而设计的云原生架构

支持的数据库

超集可以从任何使用SQL语言的数据存储或数据引擎(例如,Presto或Athena)查询具有Python DB-API驱动程序和SQLAlChemy方言的数据

更全面的支持数据库列表以及配置说明可以找到:here

想要添加对您的数据存储区或数据引擎的支持吗?阅读更多内容here关于技术要求

安装和配置

Extended documentation for Superset

参与进来吧

投稿人指南

有兴趣做贡献吗?请查看我们的CONTRIBUTING.md查找有关贡献的资源,以及有关如何设置开发环境的详细指南

资源

有趣好用的Python教程

退出移动版
微信支付
请使用 微信 扫码支付