Python notebook 中的 !curl 命令失败,出现 500 内部错误

Posted

技术标签:

【中文标题】Python notebook 中的 !curl 命令失败,出现 500 内部错误【英文标题】:!curl commands in Python notebook fail with 500 Internal error 【发布时间】:2022-01-20 13:38:40 【问题描述】:

我在 Google Colab 中运行以下代码并获得 The server encountered an internal error or misconfiguration and was unable to complete your request。如果我在运行命令时没有像下面那样传入变量$data,它运行得非常好。只有当我遍历文件并传递变量时它似乎失败了

import csv
import json

reader = csv.reader(open('/content/drive/MyDrive/file5.csv'))
for row in reader:
    data = "snps": row[0], "pop": "YRI", "r2_threshold": "0.9", "maf_threshold": "0.01"
    data = json.dumps(data)
    data = "''".format(data)
    !curl -k -H "Content-Type: application/json" -X POST -d "$data" 'https://ldlink.nci.nih.gov/LDlinkRest/snpclip?token=e3e559472899'

这行得通:

!curl -k -H "Content-Type: application/json" -X POST -d '"snps": "rs3\nrs4", "pop":"YRI", "r2_threshold": "0.1", "maf_threshold": "0.01"' 'https://ldlink.nci.nih.gov/LDlinkRest/snpclip?token=e3e559472899'

【问题讨论】:

首先使用请求,因为它很容易管理它的属性。还可以尝试打印出您传递给请求的值,以便您知道错误发生在哪一行。 【参考方案1】:

更新:实际上,ipython 确实允许您在循环中运行 ! 转义;代码中的实际错误纯粹在于不正确的引用(尤其是在 data 值周围添加单引号,但可能还有更多)。

下面的原始(部分错误)答案。


! 转义告诉你的笔记本(Google Colab、Jupyter 或你有什么;基本上任何运行 ipython 作为内核或类似的东西)离开 Python 并运行 shell 命令。 Python 本身不支持这个;最接近的近似值类似于

import subprocess
...
for row in reader:
    data = "snps": row[0], "pop": "YRI", "r2_threshold": "0.9", "maf_threshold": "0.01"
    data = json.dumps(data)
    # This was wrong on so many levels
    # data = "''".format(data)
    subprocess.run(['curl', '-k',
        '-H', "Content-Type: application/json",
        '-X', 'POST', '-d', data,
        'https://ldlink.nci.nih.gov/LDlinkRest/snpclip?token=e3e559472899'],
        text=True, check=True)

虽然避免 subprocess 并运行 Python urllibrequests 代码来执行 POST 会更加高效和优雅,并且让您可以更好地控制发送的内容和处理方式。

在 shell 命令和 Python 之间转换时如何正确引用字符串需要你了解 shell 的引用行为。我只是简要说明一下,我在原始命令中不正确的地方留下了双引号,但在其他方面首选单引号,当然,data 现在指的是具有该名称的正确 Python 变量,而不是带有同名。

重申:ipython(这是您的笔记本的接口)知道如何通过! 运行 Python 代码和 shell scipt 代码;但是一旦你要求它运行 Python 代码,ipython 就将它交给 Python,你就不再在 ipython 中了。

【讨论】:

感谢您的接受,但我原来的答案并不正确。请查看更新后的答案。

以上是关于Python notebook 中的 !curl 命令失败,出现 500 内部错误的主要内容,如果未能解决你的问题,请参考以下文章

从父目录中的 python 模块导入到子目录中的 jupyter notebook 文件中

Python:Jupyter Notebook 中的漂亮打印

Jupyter Notebook 中的 Python 相对导入

在Jupyter notebook中使用特定虚拟环境中的python的kernel

Jupyter Notebook从同一目录中的python文件导入类

有没有办法让 jupyter notebooks 中的 python showtraceback 可以滚动?