A year ago, I wrote about the sad state of Python packaging. The large number of tools in the space, the emphasis on writing vague standards instead of rallying around the One True Tool, and the complicated venv-based ecosystem instead of a solution similar to node_modules. What has changed in the past year? Has anything improved, is everything the same, or are things worse than they were before? 一年前,我写了一篇关于Python打包的悲惨状态的文章。该领域的大量工具,强调编写模糊的标准而不是围绕一个真正的工具,以及复杂的 venv 基于生态系统而不是类似于 node_modules .在过去的一年里发生了什么变化?有什么改进吗,一切都一样,还是比以前更糟? The tools 工具 The original post listed a bunch of packaging tools, calling fourteen tools at least twelve too many. My idea with that was that most people …
使用XPath定位web元素的优点 使用定位器定位网页上的元素取决于DOM(文档对象模型)的复杂性。下面给出了使用XPath作为定位器来捕获网页中的元素的五个优点: 在XPath定位器的帮助下,可以向上或向下遍历DOM。 它有助于使用文本定位网页中的元素。 它通过建立父节点、子节点和后代节点之间的关系来帮助定位元素。 如果有多个匹配项,则通过指定元素的位置来精确定位元素。 唯一地定位DOM中的任何元素。 1. SelectorsHub SelectorsHub是一个Chrome扩展,它有助于非常容易地找到XPath规则。SelectorsHub支持隐藏的DOM、iframe、frame和SVG元素,允许我们编写XPath并随后验证它。 2. XPath Finder 这是一个最简单的Chrome扩展。点击插件,鼠标指针立即变成一个十字符号,移动需要确定XPath的WebElement,该元素将突出显示。 3. XPath Helper XPath助手使提取、编辑和评估任何网页上的XPath查询变得很容易。它也是广受好评和推荐的用于查找Xpath的Chrome扩展之一,它可以平滑地定位webbelements。 4. Scraper Scraper可以从网页中提取数据,并将它们对齐到电子表格中。它是一个简单和容易的扩展,可以使在线研究更便捷。 5. Relative XPath Helper 顾名思义,Relative XPath Helper是一个Chrome扩展,它帮助确定两个web元素的相对XPath表达式。它是一个简单而方便的扩展,用于比较两个web元素。 6. Firebug Lite Chrome Firebug是早期用于查找元素XPath的浏览器扩展之一。Firebug Lite是Firebug的一个端口,因为Chrome不再支持Firebug。 7. TruePath 这个Xpath finder Chrome扩展是最高效的插件之一,它根据不同的属性提供了多个相对Xpath,因此作为查找Xpath的最受欢迎的Chrome扩展之一占据了C位。 8. XPath Helper Wizard XPath Helper Wizard创建的XPath较短,即使在网页中进行任何更改,其中断的可能性也较小。方便易用的Xpath finder Chrome扩展程序Xpath Helper Wizard,既易用又有效 9. XPath Generator XPath Generator是最著名的扩展之一,可以添加到Chrome来查找web元素的XPath。在浏览器中捕获XPath是一种非常简单的技术。
简介 python-whois一个用于查询域名whois信息的python包,比whois包速度更快、查询数据更多、更详细 功能 一个简单的可导入Python模块,该模块将为给定域生成已解析的WHOIS数据。 能够提取所有主流的TLD(com,org,net等)的数据 直接查询WHOIS服务器,而不是像其他许多服务一样通过中间Web服务。 适用于Python 2和3 使用 1、安装 pip install python-whois 2、测试 python3 -m unittest discover test 输出: { "domain_name": [ "YNFMACHINERYPARTS.COM", "ynfmachineryparts.com" ], "registrar": "SHANGHAI MEICHENG TECHNOLOGY INFORMATION DEVELOPMENT CO., LTD.", "whois_server": "grs-whois.cndns.com", "referral_url": null, "updated_date": [ "2020-12-08 07:49:14", "2019-08-14 12:18:03" ], "creation_date": "2018-02-03 00:37:32", "expiration_date": [ "2025-02-03 00:37:32", "2025-02-03 08:37:32" ], "name_servers": [ "NS1.ES1003.SITEGROUND.EU", "NS2.ES1003.SITEGROUND.EU" ], "status": [ "clientTransferProhibited https://icann.org/epp#clientTransferProhibited", "ok https://icann.org/epp#ok" ], "emails": "domain@cndns.com", "dnssec": "unsigned", "name": null, "org": null, "address": null, "city": null, "state": "Shanghai", "zipcode": null, "country": "cn" } [datetime.datetime(2025, 2, 3, 0, 37, 32), datetime.datetime(2025, 2, 3, 8, 37, 32)] ———————————————————————- Ran …
简介 用于检索域名WHOIS信息的Python软件包:Whois 当前版本:0.9.7 模块功能 适用于Linux “whois” 命令的Python包装器 用于返回给定域的已解析WHOIS数据 能够提取所有流行的TLD(com,org,net,biz,info,pl,jp,uk,nz等)的数据 直接查询WHOIS服务器,而不像其他许多工具一样通过中间Web服务 适用于Python 2.4+和Python 3.x 所有日期作为日期时间对象 可以缓存结果 使用 1、安装 pip install whois # or pip3 install whois 2、简单举例: import whois import pprint domain = whois.query(‘wordpress1.com’) pprint.pprint(domain.__dict__) print(‘name: ‘ + domain.name) 输出: {‘creation_date’: datetime.datetime(2019, 3, 5, 22, 27, 20), ‘expiration_date’: datetime.datetime(2022, 3, 5, 22, 27, 20), ‘last_updated’: None, ‘name’: ‘wordpress1.com’, ‘name_servers’: {‘f1g1ns2.dnspod.net’, ‘f1g1ns1.dnspod.net’}, ‘registrar’: ‘北京新网数码信息技术有限公司’, ‘status’: ‘ok’} name: wordpress1.com ccTLD & TLD 支持 ccTLD – uz – ac.uk – ar – at – be – br – ca – co – co.jp – cl – cn – cz – de – eu – …
前言 由于公司注册大量域名信息需要定期查看是否需要续期,前期都是人工操作比较耗时、耗力。所以衍生了这个小工具。 实现了查询域名到期时间、并且将近7天内到期的域名在Excel中标红,当然你也可以添加短信提醒和邮件提醒 代码步骤 1、将域名粘贴到指定txt文件中 比如:domain.txt 2、将指定txt文件中内容读取到list中 # 批量读取文件中的域名 def read_file(filePath): with open(filePath, "r") as f: # 打开文件 data = f.readlines() # 读取文件 return data 3、通过某网站获取域名到期时间 # 通过某网站获取域名到期时间 def get_expiry_date(url_list): url_expiry_date_list = [] for url in url_list: url_expiry_date_dict = {} time.sleep(random.randrange(3)) req_whois = urllib.request.urlopen(‘http://whois.xxxxxx.com/’ + url) result = req_whois.read().decode() html = etree.HTML(result) endTimes = html.xpath(‘//a[@id="update_a2"]/preceding-sibling::span[1]/text()’) if len(endTimes) > 0: endTime = endTimes[0].replace(‘年’, ‘-‘).replace(‘月’, ‘-‘).replace(‘日’, ”) else: errorInfo = html.xpath(‘//div[@class="IcpMain02"]’) endTime = errorInfo[0].xpath(‘string(.)’).strip() url_expiry_date_dict[‘url’] = url.replace(‘\n’, ”) url_expiry_date_dict[‘endTime’] = endTime pprint.pprint(url_expiry_date_dict) url_expiry_date_list.append(url_expiry_date_dict) pprint.pprint(url_expiry_date_list) return url_expiry_date_list 4、将结果写入Excel文件 # 写入Excel文件 def write_excel(domain_list): # 创建一个新的文件 with xlsxwriter.Workbook(‘host_ip.xlsx’) as workbook: # 添加一个工作表 worksheet = workbook.add_worksheet(‘域名信息’) …
前言 Retrying是一个Apache 2.0授权的通用重试库,用Python编写,以简化向任何东西添加重试行为的任务。 最简单的用例是每当发生异常时都重新尝试一个flaky函数,直到返回一个值。 import random from retrying import retry @retry def do_something_unreliable(): if random.randint(0, 10) > 1: raise IOError("Broken sauce, everything is hosed!!!111one") else: return "Awesome sauce!" print do_something_unreliable() 特性 一般装饰API 指定停止条件(即尝试次数限制) 指定等待条件(即尝试之间的指数回退睡眠) 自定义对异常的重试 自定义在预期的返回结果上重试 安装 安装非常简单 pip install retrying # or pip3 install retrying # or easy_install retrying 举例 1、不添加任何参数,默认一直报错就一直重试 @retry def never_give_up_never_surrender(): print "永远重试,忽略异常,重试之间没有等待" 2、设置你需要重试的次数 @retry(stop_max_attempt_number=7) def stop_after_7_attempts(): print "尝试7次后停止" 3、设置最大延迟时间 如果调用的函数出现异常,那么就会重复调用这个函数,最大调用时间,默认为100毫秒 @retry(stop_max_delay=10000) def stop_after_10_s(): print "10秒后停止" 4、设置每次调用间隔等待时间 @retry(wait_fixed=2000) def wait_2_s(): print "重试之间等待2秒" 5、设置每次调用间隔等待时间:随机 wait_random_min:最短时间wait_random_max:最长时间 @retry(wait_random_min=1000, wait_random_max=2000) def wait_random_1_to_2_s(): print "在重试之间随机等待1-2秒" 总结 stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就停止重试 stop_max_delay:比如设置成10000,那么从被装饰的函数开始执行的时间点开始,到函数成功运行结束或者失败报错中止的时间点,只要这段时间超过10秒,函数就不会再执行了 wait_fixed:设置在两次retrying之间的停留时间 wait_random_min和wait_random_max:用随机的方式产生两次retrying之间的停留时间 wait_exponential_multiplier和wait_exponential_max:以指数的形式产生两次retrying之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个retrying之间的停留值都为wait_exponential_max 我们可以指定要在出现哪些异常的时候再去retry,这个要用retry_on_exception传入一个函数对象
大数据和AI的用途越来越广泛,再也不是大公司的专属; 一、ModuleNotFoundError: No module named ‘json’ 宝塔部署Python项目网上的教程有很多不在赘述;部署完成启动项目提示成功,但是状态一直是“已暂停”;查看日志报错信息为: ModuleNotFoundError: No module named ‘json’ 解决方案: 修改配置文件中: user = ‘www’ 修改为 user = ‘root’ 二、宝塔利用git+ webhooks 实现git更新远程同步云服务器 官网教程:https://gitee.com/help/articles/4181#article-header0 ssh -T git@gitee.com 这个命令不能少 添加webhooks后,一定在ssh命令行测试是否可以不用输入用户名密码即可clone项目 如果添加了rsa或者公钥依然要输入用户名密码可以试试,git仓库的ssh链接 在shell脚本中也需要修改: #!/bin/bash echo "" #输出当前时间 date –date=’0 days ago’ "+%Y-%m-%d %H:%M:%S" echo "Start" #判断宝塔WebHook参数是否存在 if [ ! -n "$1" ]; then echo "param参数错误" echo "End" exit fi #git项目路径 gitPath="/www/wwwroot/$1" #git 网址 注意!注意!注意! #gitHttp="https://gitee.com/isu5cn/$1.git" gitHttp="git@gitee.com/isu5cn/$1.git" echo "Web站点路径:$gitPath" #判断项目路径是否存在 if [ -d "$gitPath" ]; then cd $gitPath #判断是否存在git目录 if [ ! -d ".git" ]; then echo "在该目录下克隆 git" git clone $gitHttp gittemp mv gittemp/.git . rm -rf gittemp fi #拉取最新的项目文件 git …
背景 基于Qt的应用程序(像大多数GUI应用程序一样)是基于事件的。这意味着执行是根据用户交互、信号和计时器来驱动的。在事件驱动的应用程序中,单击按钮将创建一个事件,应用程序随后将处理该事件以产生预期的输出。事件被推入和从事件队列取出,然后按顺序处理。 事件循环通过在QApplication对象上调用.exec_()开始,并在与Python代码相同的线程中运行。运行这个事件循环的线程——通常称为GUI线程——也处理与主机操作系统的所有窗口通信。 默认情况下,由事件循环触发的任何执行也将在这个线程中同步运行。在实践中,这意味着当PyQt应用程序在代码中执行某些操作时,窗口通信和GUI交互将被阻塞。 如果您所做的很简单,并且快速地将控制返回到GUI循环,那么用户将无法察觉这种阻塞。但是,如果您需要执行长时间运行的任务,例如打开/写入一个大文件、下载一些数据或渲染一些复杂的界面,那么就会出现问题。对用户来说,应用程序似乎没有响应(因为它确实没有响应)。因为你的应用程序不再与操作系统通信,在MacOS X上,如果你点击你的应用程序,你会看到旋转的死亡轮。没有人希望这样。 解决方案很简单:将您的工作从GUI线程中取出(放到另一个线程中)。PyQt(通过Qt)提供了一个简单的接口来实现这一点。 线程和进程 在PyQt应用程序中运行独立任务有两种主要方法:线程和进程。 线程共享相同的内存空间,因此启动速度快,消耗的资源最少。共享内存使得在线程之间传递数据变得非常简单,但是从不同的线程读/写内存可能会导致竞争条件或分段错误。在Python中还有一个额外的问题,即多个线程被同一个全局解释器锁(GIL)绑定——这意味着非GIL释放的Python代码一次只能在一个线程中执行。但是,这不是PyQt的主要问题,因为大部分时间都花在Python之外。 进程使用独立的内存空间(和一个完全独立的Python解释器)。这样可以避免GIL的任何潜在问题,但代价是启动时间较慢、内存开销较大以及发送/接收数据的复杂性。 为了简单起见,这篇文章将使用线程演示; QRunnable和QThreadPool Qt为在线程中运行提供了非常简单的接口。它是围绕两个类构建的:QRunnable和QThreadPool。前者是您想要执行的工作的容器,而后者是您将该工作传递给其他线程的方法。 from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * import time class MainWindow(QWidget): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setWindowTitle("高效码农") self.threadpool = QThreadPool() Vlayout = QVBoxLayout() okButton = QPushButton("OK") okButton.clicked.connect(self.oh_no) Vlayout.addWidget(okButton) self.setLayout(Vlayout) self.show() def oh_no(self): worker = Worker() self.threadpool.start(worker) class Worker(QRunnable): @pyqtSlot() def run(self): print("Thread start") time.sleep(5) print("Thread complete") app = QApplication([]) window = MainWindow() app.exec_() 创建一个Worker实例,然后传递给self.threadpool;现在,单击该按钮将创建一个工作程序来处理(长时间运行)进程,并通过线程池将其拆分为另一个线程。 改进QRunnables 如果要将自定义数据传递给执行功能,可以通过init进行操作,然后可以用self.从run插槽中访问数据。 class Worker(QRunnable): def __init__(self, fn, *args, **kwargs): super(Worker, self).__init__() # Store constructor arguments (re-used for processing) self.fn = fn self.args = args self.kwargs …
一、简介 PyQt5布局一般可分为: QHBoxLayout: 横向布局 QVBoxLayout: 纵向布局 QGridLayout: 表格布局 QStackedLayout: 堆砌布局 下面我们一一介绍这几种布局,为了更直观的表现布局,我们先设计一个组件并涂上颜色: from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * # 仅用于访问命令行参数 import sys class Color(QWidget): def __init__(self, color, *args, **kwargs): super(Color, self).__init__(*args, **kwargs) self.setAutoFillBackground(True) palette = self.palette() palette.setColor(QPalette.Window, QColor(color)) self.setPalette(palette) # 子类QMainWindow来定制你的应用程序的主窗口 class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setWindowTitle("高效码农") widget = Color(‘red’) self.setCentralWidget(widget) # 每个应用程序需要一个(且只有一个)QApplication实例。 # 如果确定不会使用命令行参数,QApplication([])也可以。 app = QApplication(sys.argv) window = MainWindow() window.show() # 重要!!!!! Windows 默认是隐藏的. # 启动. app.exec_() 二、QVBoxLayout 垂直布局 使用QVBoxLayout,可以将小部件线性地排列在另一个下面。将把新的小部件添加到列的底部。 from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * # 仅用于访问命令行参数 import sys class Color(QWidget): def …
一、简介 在Qt(和大多数用户界面)中,“小部件”是用户可以与之交互的UI组件的名称。用户界面由布置在窗口内的多个小部件组成。 Qt带有大量可用的小部件,也允许您创建自己的自定义和自定义小部件。 二、小部件列表 Qt文档中提供了所有小部件的完整列表,但让我们快速了解一下它们的实际效果。 from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * # 仅用于访问命令行参数 import sys # 子类QMainWindow来定制你的应用程序的主窗口 class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.setWindowTitle("高效码农") layout = QVBoxLayout() widgets = [QCheckBox, QComboBox, QDateEdit, QDateTimeEdit, QDial, QDoubleSpinBox, QFontComboBox, QLCDNumber, QLabel, QLineEdit, QProgressBar, QPushButton, QRadioButton, QSlider, QSpinBox, QTimeEdit] for w in widgets: layout.addWidget(w()) widget = QWidget() widget.setLayout(layout) # 设置窗口的中心部件。小部件将在默认情况下展开以占据窗口中的所有空间。 self.setCentralWidget(widget) # 每个应用程序需要一个(且只有一个)QApplication实例。 # 如果确定不会使用命令行参数,QApplication([])也可以。 app = QApplication(sys.argv) window = MainWindow() window.show() # 重要!!!!! Windows 默认是隐藏的. # 启动. app.exec_() 运行效果: 让我们从上到下看一下所有示例小部件: 部件 中文 QCheckbox 复选框 QComboBox 下拉列表框 QDateEdit 用于编辑日期和日期时间 QDateTimeEdit 用于编辑日期和日期时间 QDial 旋转式转盘 QDoubleSpinbox 浮点数微调器 …
触发响应用户行为和GUI事件的操作 使用信号和槽构建复杂的应用程序行为,并使用自定义事件覆盖小部件事件处理。 如前所述,用户与Qt应用程序的每次交互都会生成一个事件。事件有多种类型,每一种都代表一种不同类型的交互—例如鼠标或键盘事件。 发生的事件被传递到发生交互的小部件上特定于事件的处理程序。例如,单击小部件事件将QMouseEvent发送到小部件上的. mousepressevent处理程序。此处理程序可以查看事件所有信息,比如触发事件的原因以及事件发生的具体位置。 信号/插槽机制具有以下功能。 信号可以连接到许多插槽。 一个信号也可以连接到另一个信号。 信号参数可以是任何Python类型。 插槽可以连接到许多信号。 连接可以是直接的(即同步)或排队的(即异步)。 可以跨线程进行连接。 信号可能断开。 信号 信号(特别是未绑定的信号)是类属性。当信号被引用为该类实例的属性时,PyQt5会自动将该实例绑定到该信号,以创建绑定信号。这与Python本身用于从类函数创建绑定方法的机制相同。 一个绑定信号具有connect(),disconnect()和emit()实现相关联的功能的方法。它还具有一个signal属性,该属性是Qt SIGNAL() 宏将返回的信号的签名。 信号可能重载,即具有特定名称的信号可能支持多个签名。可以用签名对信号进行索引,以选择所需的信号。签名是一系列类型。类型可以是Python类型对象,也可以是C ++类型名称的字符串。C ++类型的名称会自动进行规范化,例如,QVariant可以使用它来代替non-normalized 。 如果信号重载,那么它将具有默认值。 发出信号时,如有可能,所有参数都将转换为C ++类型。如果参数没有对应的C ++类型,则将其包装在特殊的C ++类型中,该参数允许在Qt的元类型系统中传递该参数,同时确保正确维护其引用计数。 下面的代码给出了使用windowTitleChanged信号的一些示例。 import sys from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow from PyQt5.QtCore import Qt # Subclass QMainWindow to customise your application’s main window class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) super(MainWindow, self).__init__(*args, **kwargs) # 信号:只要窗口打开,连接函数就会被调用 # 标题改变了。新的标题将被传递给函数。 self.windowTitleChanged.connect(self.onWindowTitleChange) # 信号:只要窗口打开,连接函数就会被调用 # 标题改变了. 在lambda中丢弃新标题,调用函数时不带参数。 self.windowTitleChanged.connect(lambda x: self.my_custom_fn()) # 信号:只要窗口打开,连接函数就会被调用 # 新标题被传递给函数并替换默认参数 self.windowTitleChanged.connect(lambda x: self.my_custom_fn(x)) # 信号:只要窗口打开,连接函数就会被调用 # 新标题被传递给函数并替换默认参数。其他参数是从lambda内部传递的。 self.windowTitleChanged.connect(lambda x: self.my_custom_fn(x, 25)) # 信号:只要窗口打开,连接函数就会被调用 # 将新标题作为第一个参数发送给函数或lambdas。 self.setWindowTitle("高效码农") label = QLabel("高效码农") label.setAlignment(Qt.AlignCenter) self.setCentralWidget(label) # …
一、点击vscode 左下角 设置 二、选择Settings选项: 三、在设置搜索框中填写pythonPath,填入你虚拟环境中的python 四、点击左下角python版本,选择虚拟环境中的python
最近网站频繁、大量被黑、挂马;替换被挂马文件后需要检查是否再次被挂马,由于网站比较多,所以用这个检测网站是否再次被黑,省去每次打开网站F12检测TDK的工作量; 多线程python脚本 # -*- coding: utf-8 -*- from bs4 import BeautifulSoup import requests import threading import queue import time with open(‘url.txt’) as f: l = f.readlines() def btdk(url): try: html = requests.get(url, timeout = 10).text except: html = ‘<html><title>%s</title><meta name="keywords" content="" /><meta name="description" content="" /></html>’%url soup = BeautifulSoup(html.lower()) t = soup.title.text.encode(‘utf8′,’ignore’) try: k = soup.find(attrs={"name":"keywords"})[‘content’].encode(‘utf8′,’ignore’) except: k = "" try: d = soup.find(attrs={"name":"description"})[‘content’].encode(‘utf8′,’ignore’) except: d = "" return t,d,k class MyThread(threading.Thread): def __init__(self, queue, url): threading.Thread.__init__(self) self.queue = queue self.url = url def run(self): while True: url = self.queue.get() t,k,d = btdk(url) with open(‘tdk.txt’, ‘a+’, encoding=’UTF-8′) as s: line = …
整体思路:python脚本检测网址是否可以打开,TDK是否被篡改(待实现);将python脚本打包成exe 一、python脚本 新建脚本DetectUrl.py import urllib.request import time import datetime opener = urllib.request.build_opener() opener.addheaders = [(‘User-agent’, ‘Mozilla/49.0.2’)] # 这个是你放网址的文件名,改过来就可以了 file = open(‘test.txt’) lines = file.readlines() aa = [] for line in lines: temp = line.replace(‘\n’, ”) aa.append(temp) print(aa) print(‘开始检查:’) for a in aa: tempUrl = a try: opener.open(tempUrl) print(tempUrl+’没问题’) except urllib.error.HTTPError: print(tempUrl+’=访问页面出错’) with open(‘检测结果.txt’, ‘a’) as f: f.write(‘\n’) f.write(‘访问页面出错%s:%s’ % (datetime.datetime.now().strftime(‘%Y-%m-%d’), tempUrl)) except urllib.error.URLError: print(tempUrl+’=访问页面出错’) with open(‘检测结果.txt’, ‘a’) as f: f.write(‘\n’) f.write(‘访问页面出错%s:%s’ % (datetime.datetime.now().strftime(‘%Y-%m-%d’), tempUrl)) time.sleep(0.1) 二、安装pyinstaller pip install pyinstaller 检测是否安装成功: pyinstaller –version pyinstaller -v (pandas-example) F:\python_workspace\pandas-example>pyinstaller -v 3.5 三、打包exe pyinstaller -F -i favicon.ico DetectUrl.py
一、can only concatenate str (not “Tag”) to str 报错信息: Exception has occurred: TypeError can only concatenate str (not "Tag") to str File "F:\python_workspace\customs\extract.py", line 140, in containerInfo item[‘\” + titles[j] + ‘\”] = contents[i] File "F:\python_workspace\customs\extract.py", line 59, in parseWeb container_1_item = Extract.containerInfo(str(items[5]), str(titles[5]), myDb, url_id, county) File "F:\python_workspace\customs\detail.py", line 78, in openTab tarGetData = Extract.parseWeb(page, url_id) File "F:\python_workspace\customs\detail.py", line 40, in callUpBrowser self.openTab(driver, tarGetData) File "F:\python_workspace\customs\detail.py", line 83, in <module> detail.callUpBrowser() 解决方案二维数组的KEY中含有html标签 二、Value ‘item_total.append’ is unsubscriptable 报错信息: item_total.append[item] ——————————- item_total: list Value ‘item_total.append’ is unsubscriptablepylint(unsubscriptable-object) 解决方案item_total.append[item]改为item_total.append(item) 三、can only concatenate str (not “NoneType”) to str 报错信息: Exception has occurred: TypeError …
一、简介 simpleui 是一个基于django后台管理的主题,主要是为了美化和简化django内置的后台管理界面。 内置28款流行的主题 pip闪电安装100%兼容原生admin无需修改代码 多标签页面,各个模块更加清晰明了 配置简单,极速上手,在settings.py中加入simpleui后启动立即生效,效率提升 100%!让后端开发得心应手。 Element-UI + Vue 加持,让古老的django admin 焕然一新。 二、安装并创建虚拟环境 虚拟环境 virtualenvwrapper 参考: 三、编写Django 应用 安装 Django (reservation) F:\python_workspace\reservation>pip install django Collecting django Using cached https://files.pythonhosted.org/packages/eb/4b/743d5008fc7432c714d753e1fc7ee56c6a776dc566cc6cfb4136d46cdcbb/Django-2.2.2-py3-none-any.whl Requirement already satisfied: pytz in f:\python_workspace\reservation\lib\site-packages (from django) (2019.1) Requirement already satisfied: sqlparse in f:\python_workspace\reservation\lib\site-packages (from django) (0.3.0) Installing collected packages: django Successfully installed django-2.2.2 创建项目 打开命令行,cd 到一个你想放置你代码的目录,然后运行以下命令: django-admin startproject reservation 这行代码将会在当前目录下创建一个 reservation 目录。 让我们来确认一下你的 Django 项目是否真的创建成功了。如果你的当前目录不是外层的 reservation 目录的话,请切换到此目录,然后运行下面的命令: python manage.py runserver 你应该会看到如下输出: Watching for file changes with StatReloader Performing system checks… System check identified no issues (0 silenced). You have 17 unapplied migration(s). Your project may not work …
Python中的并行处理 并行处理是一种操作模式,其中任务在同一计算机中的多个处理器中同时执行。它旨在减少整体处理时间。 1. 简介 并行处理是一种操作模式,其中任务在同一计算机中的多个处理器中同时执行。它旨在减少整体处理时间。 但是,在进程之间进行通信时通常会有一些开销,这实际上会增加小任务的总时间而不是减少它。 在python中,multiprocessing模块用于通过使用子进程(而不是线程)来运行独立的并行进程。它允许您利用计算机上的多个处理器(Windows和Unix),这意味着,这些进程可以在完全独立的内存位置运行。 2. 你的电脑可以运行多少个最大并行进程? 你的电脑一次可以运行的最大进程数受计算机中处理器数量的限制。你可以用multiprocessing中的cpu_count()函数 >>> import multiprocessing as mp >>> print(mp.cpu_count()) 4 3. 什么是同步和异步执行? 在并行处理中,有两种类型的执行:同步和异步。 同步执行是按照启动顺序完成的过程之一。这是通过锁定主程序直到相应的过程完成来实现的。 另一方面,异步不涉及锁定。结果,结果的顺序可能会混淆,但通常可以更快地完成。 multiprocessing实现函数的并行执行有两个主要对象:PoolClass和ProcessClass。 Pool 类 1.1 同步执行 Pool.map() 和 Pool.starmap() Pool.apply() 2. 异步执行 Pool.map_async() 和 Pool.starmap_async() Pool.apply_async()) 2. Process 类 让我们讨论一个典型的问题,并使用上述技术实现并行化。在本教程中,我们坚持使用Pool该类,因为它最方便使用并提供最常见的实际应用程序。 4. 计算每行中给定范围之间存在的数量 给定2D矩阵(或列表列表),计算每行中给定范围之间存在的数量。 from numpy import random import time # 准备数据 random.seed(100) arr = random.randint(0, 10, size=[200000, 5]) data = arr.tolist() print(data[:5]) 没有并行化的解决方案 from numpy import random import time # 准备数据 random.seed(100) arr = random.randint(0, 10, size=[200000, 5]) data = arr.tolist() # print(data[:5]) def howMany_within_range(row, minimun, maximum): count = 0 for n in row: if minimun <= n <= maximum: count += 1 return …
进程和线程 1、多进程 在Unix/Linux下,可以使用fork()调用实现多进程。 要实现跨平台的多进程,可以使用multiprocessing模块。 进程间通信是通过Queue、Pipes等实现的。 如果要启动大量的子进程,可以用进程池(Pool)的方式批量创建子进程 2、 多线程 Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。 多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生。 Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。多线程的并发在Python中就是一个美丽的梦。 3、 ThreadLocal 一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题。 ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。 use_threadlocal.py 4、分布式进程 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。 Python的分布式进程接口简单,封装良好,适合需要把繁重任务分布到多台机器的环境下。 注意Queue的作用是用来传递任务和接收结果,每个任务的描述数据量要尽量小。比如发送一个处理日志文件的任务,就不要发送几百兆的日志文件本身,而是发送日志文件存放的完整路径,由Worker进程再去共享的磁盘上读取文件。
函数式编程 1. 高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。 变量可以指向函数(其他部分语言变量=函数的返回值) >>> a = abs >>> a <built-in function abs> >>> a(-10) 10 <built-in function abs> 内置函数 abs 函数名也是变量:函数名其实就是指向函数的变量! >>> abs <built-in function abs> 函数的参数可以也是函数 函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。 1.1 map() 函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个可迭代对象,并通过把函数 f 依次作用在可迭代对象的每个元素上,map对象。 >>> def square(x): … return x * x … >>> a = map(square, [1, 2, 3]) >>> print(a) <map object at 0x10f29ae80> >>> print(list(a)) [1, 4, 9] 1.2 reduce() 函数 reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算 reduce函数在python3的内建函数移除了,放入了functools模块 functools.reduce(function, iterable[, initializer]) >>> from functools import reduce >>> def f(x, y): … return x + y … >>> reduce(f, [1, 2, 3]) 6 >>> …
Ptyhon中RE模块的使用 1. 正则表达式 参考:廖雪峰的官方网站 2. Python Re模块 Python提供re模块,包含所有正则表达式的功能。由于Python的字符串本身也用转义,因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了 2.1 re.match(pattern, string[, flags]) 如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的匹配对象。None如果字符串与模式不匹配则返回; 请注意,这与零长度匹配不同。 请注意,即使在多行模式下,re.match()也只会匹配字符串的开头而不是每行的开头。 # -*- coding: UTF-8 -*- import re # 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串” pattern = re.compile(r’hello’) # 使用re.match匹配字符串,获得匹配结果,无法匹配返回None result1 = re.match(pattern, ‘hello!hello3’) result2 = re.match(pattern, ‘helloo xugj!’) result3 = re.match(pattern, ‘helo xugj!’) result4 = re.match(pattern, ‘888hello xugj!’) print(result1) # 返回的是:a Match object # 匹配result1 if result1: print(result1.group()) else: print(result1) print(‘1匹配失败’) # 匹配result2 if result2: print(result2.group()) else: print(result2) print(‘2匹配失败’) # 匹配result3 if result3: print(result3.group()) else: print(result3) print(‘3匹配失败’) # 匹配result4 if result4: print(result4.group()) else: print(result4) print(‘4匹配失败’) 参考:Match API 2.2 re.search(pattern,string,flags = 0 ) 扫描字符串,查找正则表达式模式产生匹配的第一个位置 ,并返回相应的match object.如果字符串中没有位置与模式匹配则返回None; # -*- coding:UTF-8 -*- import …