小编Joh*_*ohn的帖子

激活python虚拟环境如何修改sys.path?

我使用以下方法创建了我的 python 虚拟环境:

python3 -m venv venv3
Run Code Online (Sandbox Code Playgroud)

激活,我source venv3/bin/activate

venv3/bin/activate 似乎没有那么复杂:

# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly

deactivate () {
    # reset old environment variables
    if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
        PATH="$_OLD_VIRTUAL_PATH"
        export PATH
        unset _OLD_VIRTUAL_PATH
    fi
    if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
        PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi

    # This should detect bash and zsh, which have a hash command that must
    # be …
Run Code Online (Sandbox Code Playgroud)

python bash python-venv

12
推荐指数
2
解决办法
2427
查看次数

为什么我在 Django 中收到“MySQL 服务器已经消失”异常?

我正在使用 Django 2.2.6。

运行我的 django 项目的同一个系统也有一个后台服务在运行,它在 unix 套接字上监听请求。在 Django Admin 中,如果用户点击按钮,Django 会在 unix socket 上发送请求,后台服务会做一些事情。

我的后台服务可以完全访问 Django 的 ORM。它从我的项目的models.py 中导入模型,并且可以毫无问题地查询数据库。

问题是,如果我离开我的 django,我的后台服务在一夜之间运行,登录到 Django Admin,然后点击按钮,我的后台服务会抛出一个异常:

django.db.utils.OperationalError: (2006, 'MySQL server has gone away')
Run Code Online (Sandbox Code Playgroud)

看来这是因为 MySQL 数据库有一个超时期限,称为wait_timeout. 如果到数据库的连接长时间不活动,MySQL 将断开它。不幸的是,Django 没有注意到,并尝试使用它,抛出错误。

幸运的是,Django 为 settings.py 中定义的每个数据库都有自己的内置 CONN_MAX_AGE 变量。如果数据库连接比 CONN_MAX_AGE 旧,它会在请求之前关闭它并启动一个新的连接。

查看我的 MySQL 数据库:

> show session variables where variable_name = "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)

查看我的 Django 的 CONN_MAX_AGE 变量:

# ./manage.py shell
>>> …
Run Code Online (Sandbox Code Playgroud)

python mysql django python-3.x

9
推荐指数
1
解决办法
2633
查看次数

Python3 的 pathlib 可以在 Linux 和 Windows 系统之间移植使用吗?

我正在用 Python3 编写一些软件,旨在备份 Windows 客户端上的目录结构,并将其发送到 Linux 服务器。

我遇到的问题是如何处理 Windows 和 Linux 文件路径。我需要 Windows 客户端创建一个表示源文件的相对路径的对象,将该相对路径发送到服务器,以便服务器知道将文件写入目标文件夹中的哪个子目录,然后发送实际数据。

发送实际数据不是问题,但是如何发送 Windows 相对路径到 Linux 系统?我尝试将其作为字符串使用os.path,但很快就变得一团糟。我正在考虑使用pathlib.

如果我可以创建某种路径对象,我可以使用 pickle 来序列化它,并将其发送到服务器。我将使用 pathlib 中的什么对象来表示路径?

Path()似乎创建了一个适用于当前文件系统(PosixPathWindowsPath)的类的实例,这些文件系统不可移植。如果我WindowsPath在 Windows 客户端上创建一个对象,Linux 将无法反序列化它,因为您甚至无法WindowsPath在 Linux 系统上实例化一个对象。

看起来我可以使用一个PureWindowsPath对象,然后将其发送到 Linux,但是如何将PureWindowsPath对象(表示相对路径)转换为 aPosixPath或至少 a PurePosixPath

那可能吗?还是我想的全错了?

python python-3.x pathlib

7
推荐指数
1
解决办法
6499
查看次数

检测 Google API 的 oAuth 令牌何时被撤销

我在这里使用 Google 的 python 快速启动脚本:https ://developers.google.com/calendar/quickstart/python

在正常情况下效果很好。我可以允许它访问我的 Gmail 帐户,并且它可以创建 Google 日历条目。

但是,如果我在浏览器中登录我的 Gmail 帐户,转到安全性,并撤销我的应用程序对我的 Google 帐户的访问权限,则快速启动脚本不会识别它。它只是崩溃了:

$ python quickstart.py
Getting the upcoming 10 events
Traceback (most recent call last):
  File "quickstart.py", line 52, in <module>
    main()
  File "quickstart.py", line 42, in main
    orderBy='startTime').execute()
  File "/opt/my_project/venv3/lib/python3.6/site-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/opt/my_project/venv3/lib/python3.6/site-packages/googleapiclient/http.py", line 851, in execute
    method=str(self.method), body=self.body, headers=self.headers)
  File "/opt/my_project/venv3/lib/python3.6/site-packages/googleapiclient/http.py", line 165, in _retry_request
    resp, content = http.request(uri, method, *args, **kwargs)
  File "/opt/my_project/venv3/lib/python3.6/site-packages/google_auth_httplib2.py", line 213, in …
Run Code Online (Sandbox Code Playgroud)

oauth google-api oauth-2.0 python-3.x google-oauth

6
推荐指数
1
解决办法
6440
查看次数

如何处理 Django Admin 中的大量删除?

我正在使用 Django 2.2.10。

我有一个名为 的模型Site,还有一个名为 的模型Record。每条记录都与一个站点(外键)相关联。

我的应用程序运行几天/几周/几个月后,每个站点都可以有数千条与之关联的记录。我有效地使用数据库,所以这通常不是问题。

然而,在 Django Admin 中,当我尝试删除站点时,Django Admin 尝试找出也将被删除的每个关联对象,并且因为我的外键使用on_delete=models.CASCADE,这正是我想要的,所以它尝试生成一个列出数千个的页面,可能有数百万条记录将被删除。有时这会成功,但需要几秒钟。有时浏览器会放弃等待。

record我怎样才能让 Django Admin 不列出它打算删除的每一个?也许只是说“将删除 x 条记录”之类的内容。

更新:我应该覆盖 Django admin 的 delete_confirmation.html 吗?看起来罪魁祸首可能是这一行:

<ul>{{ deleted_objects|unordered_list }}</ul>
Run Code Online (Sandbox Code Playgroud)

或者是否有一个选项可以启用自动不列出要删除的每个对象,也许如果对象计数超过 X 个对象?

更新2:从delete_confirmation.html 中删除上述行没有帮助。我认为生成deleted_objects 变量的视图花费的时间太长。不太确定如何覆盖 Django 管理视图

python django

6
推荐指数
1
解决办法
2072
查看次数

为什么在 Rust 中写入文件时会出现“错误的文件描述符”错误?

忽略我unwrap用来忽略文件不存在时会发生什么的事实,在我看来,这段简短的代码应该可以工作(只要文件确实存在):

use std::fs::File;
use std::io::Write;

fn main() {
    let mut f = File::open("test.txt").unwrap();
    let result = f.write_all(b"some data");

    match result {
        Ok(_) => println!("Data written successfully"),
        Err(e) => panic!("Failed to write data: {}", {e}),
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,我得到了这个:

thread 'main' panicked at 'Failed to write data: Bad file descriptor (os error 9)', src/main.rs:10:19
Run Code Online (Sandbox Code Playgroud)

需要明确的是,我知道如果我按照在线的众多示例之一进行操作,我可以写入文件。问题不是“我如何写入文件?”。这就是为什么这不起作用。

rust

6
推荐指数
1
解决办法
856
查看次数

如何使用自定义搜索字段(模型属性)在 Django Admin 中进行搜索?

这与这个问题非常相似,但不幸的是,我仍然无法让它工作。

我有一个模型,其属性组合了几个字段:

class Specimen(models.Model):
    lab_number = ...
    patient_name = ...
    specimen_type = ...

    @property
    def specimen_name(self):
        return f"{self.lab_number}_{self.patient_name}_{self.specimen_type}"
Run Code Online (Sandbox Code Playgroud)

在 Django Admin 中,当有人进行搜索时,我可以使用search_fieldsModel Admin 中的属性来指定真实字段,但不能指定specimen_name自定义字段:


def specimen_name(inst):
    return inst.specimen_name
specimen_name.short_description = "Specimen Name"

class SpecimenModelAdmin(admin.ModelAdmin):
    list_display = ('specimen_name', 'patient_name', 'lab_number', 'specimen_type')
    search_fields = ('patient_name', 'lab_number', 'specimen_type')
Run Code Online (Sandbox Code Playgroud)

使用上面的代码进行搜索,它将搜索各个字段,但如果我尝试在 Django Admin 中搜索完整的标本名称,它不会找到它,因为没有一个字段包含准确的完整标本名称。

我上面链接的 SO 问题为我指明了正确的方向 - 使用get_search_results. 我的代码现在看起来像这样:

class SpecimenModelAdmin(admin.ModelAdmin):
    ...
    search_fields = ('patient_name', 'lab_number', 'specimen_type')

    def get_search_results(self, request, queryset, search_term):
        if not search_term:
            return …
Run Code Online (Sandbox Code Playgroud)

python django

6
推荐指数
1
解决办法
3809
查看次数

如何使用 cython 编译 Flask 应用程序?

我有一个 Python Flask 应用程序,需要使用 cython 进行编译。按照本指南,我可以编译一个简单的 python 应用程序,但是当我对一个简单的 Flask 应用程序执行相同的操作时:

#!/usr/bin/env python2

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "hello"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8000)
Run Code Online (Sandbox Code Playgroud)

它似乎编译得很好,但是当我尝试运行它时,我得到了这个:

Traceback (most recent call last):
  File "./run.py", line 3, in <module>
    from app import main
ImportError: cannot import name main
Run Code Online (Sandbox Code Playgroud)

当我尝试运行 main.py 时。

我的compile.py看起来像这样:

#!/usr/bin/env python2

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [ 
    Extension("app",  ["app.py"]),
]
setup(
    name = …
Run Code Online (Sandbox Code Playgroud)

python cython flask

5
推荐指数
1
解决办法
1万
查看次数

docker build 如何知道 Dockerfile RUN 或 COPY 行是否可以使用缓存?

如果我的 Python 项目的 Dockerfile 如下所示:

FROM python:3.7

# Set env variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# Set work dir
WORKDIR /code

# Install rust
# Needed by cryptography package
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y

# Install dependencies from apt repo
RUN apt-get update && \
    apt-get install -y \
        build-essential \
        python-dev && \
    rm -rf /var/lib/apt/lists/*

# Copy and install requirements
COPY requirements.txt /code/requirements.txt
RUN pip install --no-cache --upgrade pip && \ …
Run Code Online (Sandbox Code Playgroud)

python docker

5
推荐指数
1
解决办法
1520
查看次数

为什么 mypy 试图在 Python 中实例化我的抽象类?

如果我有一个像这样的Python模块:

from abc import ABC, abstractmethod

class AbstractClass(ABC):
    @abstractmethod
    def method(self):
        pass

class ConcreteClass1(AbstractClass):
    def method(self):
        print("hello")

class ConcreteClass2(AbstractClass):
    def method(self):
        print("hello")

class ConcreteClass3(AbstractClass):
    def method(self):
        print("hello")

classes = [
    ConcreteClass1,
    ConcreteClass2,
    ConcreteClass3,
]

for c in classes:
    c().method()
Run Code Online (Sandbox Code Playgroud)

我用 击中它mypy test.py,我得到了这个:

test.py:27: error: Cannot instantiate abstract class "AbstractClass" with abstract attribute "method"
Run Code Online (Sandbox Code Playgroud)

虽然代码运行没有任何问题,但我在逻辑上看不到任何问题。我在任何时候都不会尝试实例化AbstractClass直接实例化。

我注意到一些奇怪的行为:

如果我这样做而不是循环:

...
ConcreteClass1().method()
ConcreteClass2().method()
ConcreteClass3().method()
Run Code Online (Sandbox Code Playgroud)

米比很高兴。

另外,如果我不在循环中使用 3 个类,而是执行 2 个类:

classes = [
    ConcreteClass1,
    ConcreteClass2,
    #ConcreteClass3,
]

for c in …
Run Code Online (Sandbox Code Playgroud)

python mypy

5
推荐指数
1
解决办法
554
查看次数