在 中/bin
,我运行了:
$ ls -l python3
lrwxrwxrwx 1 root root 10 Aug 8 01:44 python3 -> python3.12
$ python3 --version
Python 3.12.3
$ python3.12 --version
Python 3.12.5
有人能解释为什么当它们是符号链接时一个是“Python 3.12.3 ”,另一个是“Python 3.12.5 ”吗?
在 中/bin
,我运行了:
$ ls -l python3
lrwxrwxrwx 1 root root 10 Aug 8 01:44 python3 -> python3.12
$ python3 --version
Python 3.12.3
$ python3.12 --version
Python 3.12.5
有人能解释为什么当它们是符号链接时一个是“Python 3.12.3 ”,另一个是“Python 3.12.5 ”吗?
我想将主机名从 ansible 角色发送到 python 脚本。在我的主机文件中有 2 个主机 1ld900 和 1ld901。
我的角色如下
---
- name:execute python
script: writetoexcel.py {{ ansible_play_hosts_all | join(" ") }}
args:
executable: python3
delegate_to: localhost
但是在传递它时,传递一些额外的“[”给python脚本。如下所示,列表中也只有一个索引。
[['1ld900','1ld901']]
如果没有连接,那么它会发送一些其他用粗体标记的垃圾字符
"[['**[u**1ld900,', '**u**1ld901**]**']]
请帮助我将一个干净的列表发送到 python 脚本,如下所示
["1ld900","1ld901"]
\pyenv\1st\
我在路径中设置了一个python环境
cd /
mkdir pyenv
python3 -m venv /pyenv/1st
激活此环境的官方方法是手动键入此命令:
. /pyenv/1st/bin/activate
或者source /pyenv/1st/bin/activate
,
这将导致在(1st)
提示符前面并加载相应的 python 库。
我想保存输入并将此命令放入文件中mypy
,但sh mypy
不会1st
在我手动输入该命令时将当前终端更改为 python 环境。将该命令添加到\etc\bashrc
也无济于事。我听说该source
命令将在子进程中结束sh mypy
,但根本不会影响终端。
谁能解决这个问题?一个简单的命令或在我打开终端时自动加载该环境都会有所帮助。提前致谢。
我在 Python3 和 Enterprise Linux 8 (Rocky Linux 8) 之上使用 Ansible。
当我尝试使用json_query
时,出现以下错误:
fatal: [ansible]: FAILED! => {"msg": "You need to install \"jmespath\" prior to running json_query filter"}
但是 Python 模块似乎已经安装:
# dnf install python3-jmespath
Last metadata expiration check: 1:44:38 ago on Mi 02 Nov 2022 12:54:28 CET.
Package python3-jmespath-0.9.0-11.el8.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!
# pip3 install jmespath
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Requirement already satisfied: jmespath in /usr/lib/python3.6/site-packages
我jmespath
在交互式 Python 解释器中进行了测试,它运行正常,没有错误。这似乎可以确认 Python 模块已安装并且可以正常工作。
似乎只有在使用 Ansible 时才会出现此问题。
这是我用于测试的剧本:
---
- name: test json_query
hosts: ansible
vars:
data:
list1:
one:
name: "hello"
two:
name: "world"
tasks:
- name: search variable
ansible.builtin.debug:
var: item
loop: "{{ data | community.general.json_query('list1[*].name') }}"
我错过了什么?
这个问题与在 Jenkins 管道中使用 Python + Poetry 项目以及如何保留.venv/
设想:
我有一个触发 Python 项目的 Jenkins Pipeline 作业。该项目使用诗歌在工作空间内的 .venv 中创建虚拟环境。每次后续作业运行,它将按预期重新使用 .venv ,因此每个 pip 包不需要在每次运行时重新下载(除非poetry.lock 文件中有差异)。一切都按预期工作。
我想使用 Jenkins Workspace Cleanup Plugin 对管道进行更改,我想破坏工作区文件但保留一些文件,包括 pip/poetry/venv 环境文件。这是为了允许它重新使用上一次运行中仍然存储在 .venv 中的 pip 包——就像它在今天的工作管道上一样。
完整的管道文件示例在这篇文章的底部,但这是我添加到现有管道中的 cleanWs() 部分的片段:
post {
always {
cleanWs(
deleteDirs: true,
notFailBuild: true,
patterns: [
[pattern: '.venv', type: 'EXCLUDE'],
[pattern: '.venv/**', type: 'EXCLUDE']
]
)
}
}
这是问题:
作业第一次运行时,它工作得非常好,工作区清理工作按预期工作。该.venv/
目录按预期保留。
(问题)在作业的后续运行中,诗歌将重新安装所有包并且不会重新使用 .venv 目录:
Creating virtualenv test in /data/jenkins_home/workspace/test-cleanup/.venv
-- 这会强制重新下载每个包,即使.venv
已经存在。在作业运行之前已确认/data/jenkins_home/workspace/test-cleanup/.venv
已存在。
这是奇怪的部分:如果我在 Jenkins 服务器上手动转到工作区目录并运行与预期完全相同的命令 ,它会被重用并且不会重新安装所有包。因此,它在作业中运行的处理方式有一些特定的内容,这使得它想要重新创建 .venv 目录。poetry install
.venv
注意in-project = true
已经为诗歌设置。所以它总是会尝试在当前工作目录中使用 .venv 。
例子:
这是一个按预期工作的简单示例管道。当poetry install
step 运行时,它不会在每次作业运行时重新下载所有包,只有第一次,或者如果有差异:
pipeline {
agent any
stages {
stage("Prep Build Environment") {
steps {
script {
scmVars = git branch: "main", poll: false, url: "[email protected]:my-org/private-repo.git"
}
sh "poetry install"
}
}
}
}
这是添加的新Jenkinsfile 管道文件cleanWs()
。添加后,项目将不再在每次运行时重新使用 .venv,即使它仍然存在:
pipeline {
agent any
stages {
stage("Prep Build Environment") {
steps {
script {
scmVars = git branch: "main", poll: false, url: "[email protected]:my-org/private-repo.git"
}
sh "poetry install"
}
}
}
post {
always {
cleanWs(
deleteDirs: true,
notFailBuild: true,
patterns: [
[pattern: '.venv', type: 'EXCLUDE'],
[pattern: '.venv/**', type: 'EXCLUDE']
]
)
}
}
}
我在旧服务器上发现了一个旧代码,该代码使用 openpyxl 从大约 20 列和 >60K 行的数据集中逐项写入 Excel 文件。它通过自己填充每个单元格来做到这一点(缓慢的方式,但也不那么慢,因为整个事情在几分钟后完成,并且单元格的格式):
cell = ws.cell('%s%s' % (col_idx, i + 3))
cell.value = unicode(value).encode("utf-8")
get_style(cell, "content", column_colors[col_id])
在大约 59K 行时,它崩溃了,控制台打印:
Killed
日志显示:
Received SIGTERM, shutting down.
SIGTERM 提示内存太少,以便服务器“从外部”终止任务。它是一个虚拟机。使用该命令检查内存free
表明,通过将该小数据集(服务器上的 20 MB)写入 Excel,所有可用的 3.5 GB 都已被使用。
我在运行时检查了它,发现:500 MB 只是为了配置文件,每 10K 行 700 MB。写入数据集会导致:
需要 60 x 700 + 500 = 4700 MB 可用 RAM,而 VM 只有 3.5 GB。对于输出中这么小的文件,这应该足够了。最后的输出大约是一个 20 MB 的工作簿。输出的 Excel 版本应该是 2007 或 2010,因为它在 Python 2.73 上运行并且使用过时的旧代码。
为什么使用 Python 的 openpyxl 模块写入 20 MB 工作簿会占用千兆字节的 RAM?
我很可能只需要一个正确方向的提示。
我有一个使用 gunicorn 和 nginx 运行 Django 应用程序的 docker 容器。此 Django 应用程序当前正在从 .env 文件中获取其环境变量。
FROM python:alpine
EXPOSE 8000
RUN apk update
RUN apk add --no-cache git gcc musl-dev libffi-dev libxml2-dev libxslt-dev gcc swig g++
RUN apk add --no-cache jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff- dev tk-dev tcl-dev
RUN apk add --no-cache bash ffmpeg libmagic
RUN python3 -m pip install --upgrade pip
RUN python3 -m pip install --upgrade setuptools
RUN mkdir /opt/app
WORKDIR /opt/app
COPY . .
RUN python3 -m pip install /root/d12f/
RUN pip3 install -r requirements.txt
RUN pip3 install gunicorn
CMD sh -c 'gunicorn --conf python:app.gunicorn_conf app.wsgi --bind 0.0.0.0:8000 --reload --log-level info --access-logfile - --timeout 360 --error-logfile -'
当然,repo 中没有 .env 文件,因为这会带来安全风险。
Docker 映像由 github 创建并存储在私有 GitHub 包中。稍后,这个 docker 镜像被用于在 Kubernetes 上运行。
我正在尝试找到将 .env 文件放入的最佳解决方案
/opt/app/app/.env
作为本地文件。
如果可能的话,我宁愿不使用全局环境变量。
感谢您的任何建议。
我只是想用 Postfix+Nginx+Postgres 运行 GNU Mailman3。这是最新的 GNU/Linux Debian 稳定版,所以我刚刚apt-get
安装mailman3-full
并对配置文件进行了一些标准更改。Nginx 部分很好,SSL 工作正常,我可以从我的网络浏览器访问 Postorius 和 Hyperkitty。但是当尝试以管理员身份登录时,我收到以下错误:
ERROR 2022-02-25 21:39:55,302 118475 django.request Internal Server Error: /accounts/login/
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/lib/python3/dist-packages/django/utils/decorators.py", line 45, in _wrapper
return bound_method(*args, **kwargs)
File "/usr/lib/python3/dist-packages/django/views/decorators/debug.py", line 76, in sensitive_post_parameters_wrapper
return view(request, *args, **kwargs)
File "/usr/lib/python3/dist-packages/allauth/account/views.py", line 146, in dispatch
return super(LoginView, self).dispatch(request, *args, **kwargs)
File "/usr/lib/python3/dist-packages/allauth/account/views.py", line 74, in dispatch
response = super(RedirectAuthenticatedUserMixin, self).dispatch(
File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/usr/lib/python3/dist-packages/allauth/account/views.py", line 102, in post
response = self.form_valid(form)
File "/usr/lib/python3/dist-packages/allauth/account/views.py", line 159, in form_valid
return form.login(self.request, redirect_url=success_url)
File "/usr/lib/python3/dist-packages/allauth/account/forms.py", line 195, in login
ret = perform_login(
File "/usr/lib/python3/dist-packages/allauth/account/utils.py", line 175, in perform_login
send_email_confirmation(request, user, signup=signup, email=email)
File "/usr/lib/python3/dist-packages/allauth/account/utils.py", line 346, in send_email_confirmation
email_address.send_confirmation(request, signup=signup)
File "/usr/lib/python3/dist-packages/allauth/account/models.py", line 62, in send_confirmation
confirmation.send(request, signup=signup)
File "/usr/lib/python3/dist-packages/allauth/account/models.py", line 169, in send
get_adapter(request).send_confirmation_mail(request, self, signup)
File "/usr/lib/python3/dist-packages/allauth/account/adapter.py", line 464, in send_confirmation_mail
self.send_mail(email_template, emailconfirmation.email_address.email, ctx)
File "/usr/lib/python3/dist-packages/allauth/account/adapter.py", line 136, in send_mail
msg.send()
File "/usr/lib/python3/dist-packages/django/core/mail/message.py", line 306, in send
return self.get_connection(fail_silently).send_messages([self])
File "/usr/lib/python3/dist-packages/django/core/mail/backends/smtp.py", line 110, in send_messages
sent = self._send(message)
File "/usr/lib/python3/dist-packages/django/core/mail/backends/smtp.py", line 126, in _send
self.connection.sendmail(from_email, recipients, message.as_bytes(linesep='\r\n'))
File "/usr/lib/python3.9/smtplib.py", line 885, in sendmail
raise SMTPRecipientsRefused(senderrs)
smtplib.SMTPRecipientsRefused: {'root@localhost': (550, b'5.1.1 <root@localhost>: Recipient address rejected: User unknown in local recipient table')}
[pid: 118475|app: 0|req: 35/35] 2001:xxxx:xxxx:xxxx:xxxx:xxxx () {62 vars in 1133 bytes} [Fri Feb 25 21:39:55 2022] POST /accounts/login/ => generated 1156 bytes in 173 msecs (HTTP/1.1 500) 5 headers in 182 bytes (1 switches on core 1)
在 Postfix 日志文件中:
Feb 25 21:39:55 vps-xxx postfix/smtpd[122820]: connect from localhost[::1]
Feb 25 21:39:55 vps-xxx postfix/smtpd[122820]: NOQUEUE: reject: RCPT from localhost[::1]: 550 5.1.1 <root@localhost>: Recipient address rejected: User unknown in local recipient table; from=<root@MYDOMAIN> to=<root@localhost> proto=ESMTP helo=<vps-xxx>
Feb 25 21:39:55 vps-xxx postfix/smtpd[122820]: disconnect from localhost[::1] ehlo=1 mail=1 rcpt=0/1 rset=1 quit=1 commands=4/5
我想:也许我的本地收件人表不知何故坏了?但我可以使用以下方式发送邮件mail
:
$ mail -r 'root@localhost' -s 'just a test' 'root@localhost'
它工作得很好:
Feb 25 21:44:12 vps-xxx postfix/pickup[124104]: 9ABB540516: uid=1000 from=<root@localhost>
Feb 25 21:44:12 vps-xxx postfix/cleanup[124763]: 9ABB540516: message-id=<20220225214412.9ABB540516@MYDOMAIN>
Feb 25 21:44:12 vps-xxx opendkim[14611]: 9ABB540516: no signing table match for 'root@localhost'
Feb 25 21:44:12 vps-xxx opendkim[14611]: 9ABB540516: no signature data
Feb 25 21:44:12 vps-xxx postfix/qmgr[118558]: 9ABB540516: from=<root@localhost>, size=412, nrcpt=1 (queue active)
Feb 25 21:44:12 vps-xxx postfix/local[124765]: 9ABB540516: to=<root@localhost>, relay=local, delay=0.04, delays=0.03/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Feb 25 21:44:12 vps-xxx postfix/qmgr[118558]: 9ABB540516: removed
我root
确实可以在 's Maildir 中看到它。
有任何想法吗?
如果我没记错root@localhost
的话,是我admin
在dpkg-reconfigure
. 我以前从未使用过 GNU Mailman3,但我猜这封电子邮件一定是登录通知或类似的东西(您也可以通过send_email_confirmation
函数名称猜测它)。如果我输入了错误的密码,一切都很好(我只是在 Web UI 中得到一个很好的错误),所以只有当密码正确时才会发生这种情况。
谢谢!
我有一个日志文件如下:
12-02-2022 15:18:22 +0330 SOCK5.6699 00000 user144 97.251.107.125:38605 1.1.1.1:443 51766 169369 0 CONNECT 1.1.1.1:443
12-02-2022 15:18:27 +0330 SOCK5.6699 00094 user156 32.99.193.2:51242 1.1.1.1:443 715 388 0 CONNECT 1.1.1.1:443
12-02-2022 15:18:56 +0330 SOCK5.6699 00000 user105 191.184.66.98:40048 1.1.1.1:443 18105 29029 0 CONNECT 1.1.1.1:443
12-02-2022 15:18:56 +0330 SOCK5.6699 00000 user105 191.184.66.98:40070 1.1.1.1:443 674 26805 0 CONNECT 1.1.1.1:443
12-02-2022 15:20:24 +0330 SOCK5.6699 00000 user143 112.199.63.119:60682 1.1.1.1:443 475 445 0 CONNECT 1.1.1.1:443
12-02-2022 15:20:37 +0330 SOCK5.6699 00000 user105 191.184.66.98:40102 1.1.1.1:443 12913 18780 0 CONNECT 1.1.1.1:443
12-02-2022 15:20:42 +0330 SOCK5.6699 00000 user143 112.199.63.119:60688 1.1.1.1:443 4530 34717 0 CONNECT 1.1.1.1:443
12-02-2022 15:20:44 +0330 SOCK5.6699 00000 user127 212.167.145.49:2972 1.1.1.1:443 827 267 0 CONNECT 1.1.1.1:443
我的目标是提取此日志文件的两个部分:
以下是所需数据部分的示例。
2022 年 2 月 2 日 15:18:22 +0330 SOCK5.6699 00000用户 144 97.251.107.125 :38605 1.1.1.1:443 51766 169369 0 连接 1.1.1.1:443
所以我编写了一个 Python 脚本来提取这两个项目并将它们存储在单独的列表中,然后使用 zip 函数将它们连接起来。
import pprint
import collections
iplist=[]
for l in data:
ip_port=l[53:71]
iplist.append(ip_port.split(':')[0])
userlist=[]
for u in data:
user=u[42:52]
userlist.append(user.replace(" ", ""))
a=list(zip(iplist,userlist))
most_ip=collections.Counter(a).most_common(5)
pprint.pprint(most_ip)
这段代码工作正常,我可以使用相应的用户名获取最常用的 ip。还需要提到我没有使用re模块,因为它列出了第二个 IP(目标 IP 是 1.1.1.1-我不关心它)
问题: 除了我编写代码的方式之外,还有其他方式(更简洁)吗?
这几天我一直在搞砸:(
为什么我在 example.com/contact 上收到 403 Forbidden 错误?
这是文件/文件夹权限、Apache 用户、虚拟主机还是 Python 问题?
我正在尝试在 /contact 上运行 Django 应用程序,但第一个问题是 403 错误。
apachectl configtest
语法OKwww-data:www-data
/var/log/apache2/access.log
是空的
/var/log/apache2/error.log
包含:
[mpm_prefork:notice] [pid 69090] AH00163: Apache/2.4.41 (Ubuntu) OpenSSL/1.1.1k mod_wsgi/4.6.8 Python/3.8 已配置——恢复正常操作
[核心:通知] [pid 69090] AH00094:命令行:'/usr/sbin/apache2'
根目录下的 .htaccess 文件有
RewriteEngine on
ServerSignature Off
Options All -Indexes
这是我的 public_html 文件结构:
/etc/apache2/sites-available/default-ssl.conf:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Alias /static /var/www/html/example.com/public_html/contact/static
Alias /media /var/www/html/example.com/public_html/contact/media
<Directory /var/www/html/example.com/public_html/contact/static>
Require all granted
</Directory>
<Directory /var/www/html/example.com/public_html/contact/media>
Require all granted
</Directory>
WSGIScriptAlias /contact/contact /var/www/html/example.com/public_html/contact/contact/wsgi.py
WSGIDaemonProcess contact python-home=/var/www/html/example.com/public_html/contact/contact
WSGIProcessGroup contact
WSGISocketPrefix run/wsgi
<Directory /var/www/html/example.com/public_html/contact/contact>
<Files wsgi.py>
Require all granted
AllowOverride None
Allow from all
</Files>
</Directory>
</VirtualHost>
</IfModule>