防止无限回调循环使用带有“dcc.Interval”和“dcc.Location”(即多页面应用程序)组件的 Gunicorn 部署 Dash 应用程序

2024-04-02

我正在使用 Dash 2.0 并且我有interval.py inside apps folder:

import numpy as np
import dash
import pandas as pd
import plotly.express as px
from dash.dependencies import Output, Input
from dash import dcc
from dash import html

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)  # call flask server


app.layout = html.Div(className='row', children=[
    html.Div(children=[dcc.Graph(id='a-graph', style={'display': 'flex'}),
                       dcc.Graph(id='b-graph', style={'display': 'flex'}),
                       dcc.Interval(id='interval-component', interval=1000)])])


@app.callback(
    [
        Output('a-graph', 'figure'),
        Output('b-graph', 'figure')
    ],
    [
        Input('interval-component', 'n_intervals')
    ]
)
def update_graphs(n):
    print(f'callback happened: {n}')
    df = pd.DataFrame({"time":pd.Series(pd.date_range("1-nov-2021","2-nov-2021", freq="S")).sample(30), "bacteria_count":np.random.randint(0,500, 30), "bacteria_type":np.random.choice(list("AB"),30)})

    df["epoch_time_ms"] = df["time"].astype(int) / 1000
    df = df.sort_values("time")
    a_fig = px.line(df, x="time", y="bacteria_count", line_shape="hv", markers=True, color='bacteria_type')
    a_fig.update_traces(mode="markers+lines", hovertemplate=None)
    a_fig.update_layout(hovermode='x unified')

    b_fig = px.line(df, x="epoch_time_ms", y="bacteria_count", line_shape="hv", markers=True, color='bacteria_type')
    b_fig.update_traces(mode="markers+lines", hovertemplate=None)
    b_fig.update_layout(hovermode='x unified')
    return a_fig, b_fig


if __name__ == '__main__':
    app.run_server(debug=True)

update_graphs()如果我运行,就会按预期定期调用python3 interval.py.

但是,如果我添加索引页(index.py) 像这样:

from dash import dcc
from dash import html
from dash.dependencies import Input, Output

from app import app
from apps import interval

app.layout = html.Div([
    # represents the URL bar, doesn't render anything
    dcc.Location(id='url', refresh=False),

    dcc.Link('Top | ', href='/'),
    dcc.Link('Interval | ', href='/apps/interval'),

    # content will be rendered in this element
    html.Div(id='page-content')
])

server = app.server


@app.callback(Output('page-content', 'children'),
              Input('url', 'pathname'))
def display_page(pathname):
    if pathname == '/apps/interval':
        return interval.app.layout
    else:
        return ''


if __name__ == '__main__':
    app.run_server(debug=True)

and app.py:

import dash

app = dash.Dash(__name__, suppress_callback_exceptions=True)
server = app.server

然后我开始了gunicorn index:server -b :8086。即使我加载间隔页面,它也没有任何错误启动。但是,回调永远不会被调用。

然后,我尝试更换app = dash.Dash(__name__, external_stylesheets=...) in interval.py从应用程序导入应用程序。一旦我点击/apps/interval索引页上的链接,它进入无限循环 - 继续打印Top | Interval在我的浏览器上。

任何想法?

Thanks!


Deploying a Dash app with gunicorn with Dash dcc.Interval† as well as dcc.Location (i.e., multi-page app) features present*

* 参考 Dash 文档以了解上述组件:


Interval https://dash.plotly.com/dash-core-components/intervaldcc(dash 核心组件)组件允许在指定的时间自动更新源数据(从而自动更新页面上的某些组件)间隔.

Location https://dash.plotly.com/dash-core-components/locationdcc 组件允许访问当前的 href/路径名/URL,从而启用多页面 Dash 应用程序。

[最小] 代码设置

所以我根据你提供的内容来完成这个工作——尽管你肯定还有更多的工作要做,以完成我离开你的地方(希望这是有道理的;有多种方法可以做到这一点)。顺便说一句,我设置max_intervals=5为了dcc.Interval组件,因为否则它只会无休止地更新图表(也许这就是您想要的行为,但是,设置此限制只会有助于简化此演示)。

这是我得到的文件结构,后面是每个文件的确切内容。

.
|-- app
|   |-- __init__.py
|   |-- gunicorn
|   |   `-- logs
|   |       `-- 20211101
|   |           `-- 20211101.access.log
|   `-- interval.py
|-- index.py
`-- launch_gunicorn.sh

4 directories, 5 files

坚持您最关注的方法,即本质上将布局、回调和应用程序全部声明在一个文件中 - ”interval.py“。然后,就只剩下一个额外的Python文件了”index.py“(再次与您的帖子保持一致)它控制应用程序的多页面布局处理,也是其中的文件gunicorn将获得对 Dash 应用程序对象的所需引用(特别是应用程序的服务器子属性;即,在本例中,为app.interval.app.server)。最后,我创建了另外三分之一的额外文件,它只是一个 bashlaunch_gunicorn.shshell 脚本有助于执行应用程序的非开发/调试(即生产[虽然可能也想添加 nginx,但这是另一个问题])部署。

1) app/interval.py

import dash
import numpy as np
import pandas as pd
import plotly.express as px

from dash import dcc
from dash import html
from dash.dependencies import Input
from dash.dependencies import Output

external_stylesheets = ["https://codepen.io/chriddyp/pen/bWLwgP.css"]
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

interval_layout = html.Div(
    className="row",
    children=[
        html.Div(
            children=[
                html.Div(id="interval-update"),
                dcc.Graph(id="a-graph", style={"display": "flex"}),
                dcc.Graph(id="b-graph", style={"display": "flex"}),
                dcc.Interval(
                    id="interval-component", interval=1000, max_intervals=5
                ),
            ]
        )
    ],
)


@app.callback(
    [
        Output("a-graph", "figure"),
        Output("b-graph", "figure"),
        Output("interval-update", "children"),
    ],
    [Input("interval-component", "n_intervals")],
)
def update_graphs(n):
    app.logger.info(f"callback happened: {n}")
    df = pd.DataFrame(
        {
            "time": pd.Series(
                pd.date_range("1-nov-2021", "2-nov-2021", freq="S")
            ).sample(30),
            "bacteria_count": np.random.randint(0, 500, 30),
            "bacteria_type": np.random.choice(list("AB"), 30),
        }
    )

    df["epoch_time_ms"] = df["time"].astype(int) / 1000
    df = df.sort_values("time")
    a_fig = px.line(
        df,
        x="time",
        y="bacteria_count",
        line_shape="hv",
        markers=True,
        color="bacteria_type",
    )
    a_fig.update_traces(mode="markers+lines", hovertemplate=None)
    a_fig.update_layout(hovermode="x unified")

    b_fig = px.line(
        df,
        x="epoch_time_ms",
        y="bacteria_count",
        line_shape="hv",
        markers=True,
        color="bacteria_type",
    )
    b_fig.update_traces(mode="markers+lines", hovertemplate=None)
    b_fig.update_layout(hovermode="x unified")
    interval_update = [html.H1(f"Interval Update - {n}")]
    return a_fig, b_fig, interval_update


if __name__ == "__main__":
    app.run_server(debug=True)


2) index.py

""" ## Primary Application Deployment Script
------------------------------------

>        ????????????????????????????????????????
_____

ᵂʳⁱᵗᵗᵉⁿ ᵇʸ
  [your name]


Purpose / Overview:
------------------
This script serves as the de facto WSGI Production-level deployment module (in this case, fed to Gunicorn).

For Development-level deployment (DEBUG),
simply run this script, like so:

$ python index.py

    :   :   : ::::::: :   :   :

"""
import logging

from dash import dcc
from dash import html
from dash import no_update

from dash.dependencies import Input
from dash.dependencies import Output
from dash.dependencies import State

from dash.exceptions import PreventUpdate

from app import interval
from app.interval import app

app.layout = html.Div(
    [
        # represents the URL bar, doesn't render anything
        dcc.Location(id="url", refresh=False),
        dcc.Link("Top | ", href="/"),
        dcc.Link("Interval | ", href="/apps/interval"),
        # content will be rendered in this element
        html.Div(id="page-content"),
    ]
)


@app.callback(Output("page-content", "children"), Input("url", "pathname"))
def display_page(pathname):
    if pathname == "/apps/interval":
        return interval.interval_layout
    elif pathname == "/":
        return no_update
    else:
        return html.Div(
            [html.H1("404 Page Not Found")],
            style={"margin": "10%", "textAlign": "center"},
        )


if __name__ == "__main__":
    app.run_server(debug=True)


############################################
# #       DEPLOY* MODE: PRODUCTION       # #
# # [*WSGI import (e.g. Gunicorn+Nginx)] # #
############################################
if __name__ != "__main__":
    logger = logging.getLogger(__name__)
    logging.getLogger("matplotlib.font_manager").disabled = True
    logging.basicConfig(
        format="%(asctime)s %(name)-12s %(module)s.%(funcName)s %(processName)s %(levelname)-8s %(relativeCreated)d %(message)s",
        level=logging.INFO,
    )
    gunicorn_logger = logging.getLogger("gunicorn.error")
    app.logger.handlers = logger.handlers
    app.logger.setLevel(logger.level)
    app.logger.info(
        "Initializing dash-webapp-template (App) `app.server` for handoff..."
    )
    server = app.server


3) launch_gunicorn.sh

#!/bin/bash

# Gunicorn Launch script for Flask-based Dash app,
# ran concurrently, & in parallel.

TODAY=$(date "+%Y%m%d")
TIMESTAMP=$(date | tr -d "[[:punct:]]" | tr -d ' ')

PORT=${1:-9001}
NUM_WORKERS=${2:-4}
THREADS=${3:-8}

GUNICORN_PROD_LOGS="./app/gunicorn/logs/${TODAY}"
mkdir -p $GUNICORN_PROD_LOGS

gunicorn \
  -b 0.0.0.0:$PORT \
  -w $NUM_WORKERS \
  --worker-class gthread \
  --threads $THREADS \
  --name "dash-webapp-demo${TODAY}" \
  --max-requests 100 \
  --max-requests-jitter 10 \
  --access-logfile "${GUNICORN_PROD_LOGS}/${TODAY}.access.log" \
  index:server

通过部署应用程序Gunicorn https://docs.gunicorn.org/en/stable/run.html#gunicorn

启动后launch_gunicorn.sh,您应该会看到终端中打印出以下输出:

[...]$ ./launch_gunicorn.sh 
[2021-11-01 22:51:28 -0700] [23576] [INFO] Starting gunicorn 20.1.0
[2021-11-01 22:51:28 -0700] [23576] [INFO] Listening at: http://0.0.0.0:9001 (23576)
[2021-11-01 22:51:28 -0700] [23576] [INFO] Using worker: gthread
[2021-11-01 22:51:28 -0700] [23580] [INFO] Booting worker with pid: 23580
[2021-11-01 22:51:28 -0700] [23581] [INFO] Booting worker with pid: 23581
[2021-11-01 22:51:28 -0700] [23582] [INFO] Booting worker with pid: 23582
[2021-11-01 22:51:28 -0700] [23583] [INFO] Booting worker with pid: 23583
2021-11-01 22:51:30,464 app.interval index.<module> MainProcess INFO     2686 Initializing dash-webapp-template (App) `app.server` for handoff...
2021-11-01 22:51:30,489 app.interval index.<module> MainProcess INFO     2712 Initializing dash-webapp-template (App) `app.server` for handoff...
2021-11-01 22:51:30,560 app.interval index.<module> MainProcess INFO     2783 Initializing dash-webapp-template (App) `app.server` for handoff...
2021-11-01 22:51:30,621 app.interval index.<module> MainProcess INFO     2844 Initializing dash-webapp-template (App) `app.server` for handoff...

这是因为我将默认工作人员数量设置为 4。您可以在launch_gunicorn.sh文件,或者作为参数传递。如您所见,该脚本接受三个optional参数:分别是端口、工作线程数和线程数。

然后我们会看到以下非常基本的主应用程序页面:

单击“间隔”链接会显示:

这是通过 Dash 进行的第五次也是最后一次自动“间隔”页面更新dcc.Interval主要组件interval.py应用程序布局+回调(您采用了一种一体化方法 - 效果很好!)文件。

在主动部署期间监控应用程序

我们可以在终端中看到记录的以下更新:

2021-11-01 23:11:26,140 app.interval interval.update_graphs MainProcess INFO     175805 callback happened: None
2021-11-01 23:11:26,190 numexpr.utils utils._init_num_threads MainProcess INFO     175854 NumExpr defaulting to 4 threads.
2021-11-01 23:11:27,270 app.interval interval.update_graphs MainProcess INFO     176935 callback happened: 1
2021-11-01 23:11:28,131 app.interval interval.update_graphs MainProcess INFO     177796 callback happened: 2
2021-11-01 23:11:29,129 app.interval interval.update_graphs MainProcess INFO     178793 callback happened: 3
2021-11-01 23:11:30,136 app.interval interval.update_graphs MainProcess INFO     179801 callback happened: 4
2021-11-01 23:11:31,133 app.interval interval.update_graphs MainProcess INFO     180797 callback happened: 5

并且在app/gunicorn/logs/[today's date]/[today's date].access.log自动创建的文件,您将找到以下信息:

127.0.0.1 - - [01/Nov/2021:23:08:43 -0700] "GET / HTTP/1.1" 200 1781 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:08:43 -0700] "GET /_dash-layout HTTP/1.1" 200 462 "http://0.0.0.0:9001/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:08:43 -0700] "GET /_dash-dependencies HTTP/1.1" 200 357 "http://0.0.0.0:9001/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:08:44 -0700] "POST /_dash-update-component HTTP/1.1" 204 0 "http://0.0.0.0:9001/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:08:53 -0700] "GET /_dash-component-suites/dash/dcc/dash_core_components-shared.js.map HTTP/1.1" 200 26038 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:08:53 -0700] "GET /_dash-component-suites/dash/html/dash_html_components.min.js.map HTTP/1.1" 200 687871 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:08:53 -0700] "GET /_dash-component-suites/dash/dash_table/bundle.js.map HTTP/1.1" 200 154018 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:08:53 -0700] "GET /_dash-component-suites/dash/dcc/dash_core_components.js.map HTTP/1.1" 200 1996412 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:26 -0700] "POST /_dash-update-component HTTP/1.1" 200 651 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:26 -0700] "GET /_dash-component-suites/dash/dcc/async-graph.js HTTP/1.1" 304 0 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:26 -0700] "GET /_dash-component-suites/dash/dcc/async-graph.js.map HTTP/1.1" 200 75008 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:26 -0700] "GET /_dash-component-suites/dash/dcc/async-plotlyjs.js HTTP/1.1" 200 3594037 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:27 -0700] "POST /_dash-update-component HTTP/1.1" 200 16924 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:27 -0700] "POST /_dash-update-component HTTP/1.1" 200 16915 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:28 -0700] "POST /_dash-update-component HTTP/1.1" 200 16909 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:29 -0700] "POST /_dash-update-component HTTP/1.1" 200 16911 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:30 -0700] "POST /_dash-update-component HTTP/1.1" 200 16903 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
127.0.0.1 - - [01/Nov/2021:23:11:31 -0700] "POST /_dash-update-component HTTP/1.1" 200 16915 "http://0.0.0.0:9001/apps/interval" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"

显示服务器收到的请求。

最后,运行例如htop并向下过滤(在这种情况下,我只是过滤“破折号”,因为在launch_gunicorn.sh在gunicorn命令选项文件中,有一个配置可以为你的gunicorn工作进程指定一个特定的名称;见下文)对于我们的应用程序,我们可以看到实际的gunicorn工人:

如果有任何疑问/问题,请留言 ????

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止无限回调循环使用带有“dcc.Interval”和“dcc.Location”(即多页面应用程序)组件的 Gunicorn 部署 Dash 应用程序 的相关文章

  • 重新排序 numpy ndarray 的最后一个维度

    我有一个未指定维度的数组 可能是 1D 2D 3D 4D 我想使用与最后一个维度大小相同的索引数组来申请对最后一个维度进行重新排序 我知道如何使用虚拟 if if 语句来做到这一点 import numpy as np a np ones
  • 列出类的所有实例

    我编写了一个 Python 模块 其中有几个类继承自一个名为MasterBlock 我想在脚本中导入此模块 创建这些类的多个实例 然后获取该类的所有子级的所有现有实例的列表MasterBlock班级 我找到了一些解决方案vars Block
  • 如何以 HDF5 格式提供 caffe 多标签数据?

    我想将 caffe 与矢量标签一起使用 而不是整数 我检查了一些答案 似乎 HDF5 是更好的方法 但后来我陷入了这样的错误 precision layer cpp 34 检查失败 outer num inner num bottom 1
  • 为什么 urllib2 出现 urllib2.HTTPError 而 urllib 没有错误?

    我有以下简单的代码 import urllib2 import sys sys path append BeautifulSoup BeautifulSoup 3 1 0 1 from BeautifulSoup import page h
  • Enthought Python 中的线程 FFT

    Numpy SciPy 中的快速傅立叶变换 FFT 不是线程化的 Enthought Python 附带 Intel MKL 数值库 该库能够进行线程 FFT 如何获得这些例程 以下代码适用于 Windows 7 Ultimate 64 位
  • Pytorch 损失为 nan

    我正在尝试用 pytorch 编写我的第一个神经网络 不幸的是 当我想要得到损失时遇到了问题 出现以下错误信息 RuntimeError Function LogSoftmaxBackward0 returned nan values in
  • 以类似字典的方式将新项目添加到某些结构化数组中

    我想扩展 numpy 中的结构化数组对象 以便我可以轻松添加新元素 例如 对于一个简单的结构化数组 gt gt gt import numpy as np gt gt gt x np ndarray 2 dtype names A B fo
  • 如何/在哪里发布 Python 包

    如果一个人创建了一个有用的 Python 包 那么如何 在哪里发布 宣传它以供其他人使用 我已经把它放到了 github 上 但几周后谷歌也没有找到它 包装整洁完整 我制作它供我个人使用 不与其他人分享将是一种耻辱 这是 PyPI 指南 h
  • 通过 pyodbc 连接到 Azure SQL 数据库

    我使用 pyodbc 连接到本地 SQL 数据库 该数据库工作正常 SQLSERVERLOCAL Driver SQL Server Native Client 11 0 Server localdb v11 0 integrated se
  • 使用 Pandas 滚动差异

    您好 我正在尝试使用 Pandas 滚动函数来计算下表中的滚动差异 我正在尝试生成 每月可用项目 列中的值 但没有得到任何结果 请帮忙 Item Adds Subtracts Month Monthly Available items A
  • 通过 Python 在 PostgreSQL 中的 unicode 字符串中是否允许空字节?

    unicode 字符串中是否允许空字节 我不问 utf8 我的意思是 unicode 字符串的高级对象表示 背景 我们通过 Python 在 PostgreSQL 中存储包含空字节的 unicode 字符串 如果我们再次读取字符串 字符串会
  • 在Python中随机化列表[重复]

    这个问题在这里已经有答案了 我想知道是否有一个好方法来 震动 Python 中的项目列表 例如 1 2 3 4 5 可能会被动摇 随机化 3 1 4 2 5 任何顺序都同样可能 from random import shuffle list
  • 包装 C++ Qt 小部件以便在 Python 中与 PySide 一起使用

    在 Python 中使用自定义 Qt 显示小部件包装自定义 C 库以便在基于 PySide 的 QApplication 中使用的最佳方法是什么 C 库是否需要特殊处理才能使用 SWIG 进行包装 封装的 Qt 小部件能否与 PySide
  • 按多索引的一级对 pandas DataFrame 进行排序

    我有一个多索引 pandas DataFrame 需要按索引器之一进行排序 这是数据片段 gene VIM treatment dose time TGFb 0 1 2 0 158406 1 2 0 039158 10 2 0 052608
  • 如何从 Selenium 获取元素的属性

    我正在 Python 中使用 Selenium 我想得到 val of a
  • 使用 PIL 合并图像时模式不匹配

    我正在传递 jpg 文件的名称 def split image into bands filename img Image open filename data img getdata red d 0 0 0 for d in data L
  • Windows 10 上的 Tensorflow 安装问题

    我正在尝试在 Win 10 计算机上安装 Tensorflow 我成功安装了Python 3 7 然后尝试按照tensorflow org上的安装说明进行操作 执行时 pip install tensorflow 我收到以下错误消息 错误
  • 使用 boto3 将 csv 文件保存到 s3

    我正在尝试写入 CSV 文件并将其保存到 s3 中的特定文件夹 存在 这是我的代码 from io import BytesIO import pandas as pd import boto3 s3 boto3 resource s3 d
  • Python中如何实现相对导入

    考虑 stuff init py mylib py Foo init py main py foo init py script py script py想要进口mylib py 这只是一个示例 但实际上我只想在父目录中进行模块的相对导入
  • 继承自 NumPy 数组的类如何更改其自身的值?

    我有一个继承自 NumPy n 维数组的简单类 我想要该类的两个方法可以更改该类实例的数组值 其中一种方法应将类实例的数组设置为类实例的列表数据属性的值 另一种方法应将一些列表值附加到类实例的数组中 我不确定如何实现这一点 但我的尝试如下

随机推荐