diff --git a/.idea/misc.xml b/.idea/misc.xml
index 44f3fa9..d56657a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/.idea/onekey.iml b/.idea/onekey.iml
index 74d515a..7eb1baf 100644
--- a/.idea/onekey.iml
+++ b/.idea/onekey.iml
@@ -4,7 +4,7 @@
-
+
\ No newline at end of file
diff --git a/dist/config.ini b/dist/config.ini
index c477692..6462b36 100644
--- a/dist/config.ini
+++ b/dist/config.ini
@@ -52,7 +52,7 @@ gm_url = http://${domain_name}:${web_port}/gm
gm_code = 123456
gm_user = test
gm_pass = test
-game_back = http://${domain_name}:${web_port}/gameback
+game_url = http://${domain_name}:${web_port}/gameback
game_code = 123456
game_user = test
game_pass = test
@@ -79,11 +79,11 @@ android_name_file = ${android_path}game\
tmp_android_name = ${android_path}game_tmp.apk
new_android_name = ${android_path}game_signed.apk
-[pc]
+[PC]
pc_path = ${GAME:client_path}pc\
pc_name = ${pc_path}pc\bin.exe
-[ios]
+[IOS]
ios_path = ${GAME:client_path}ios\
ios_name = ${android_path}game.ipa
@@ -92,6 +92,8 @@ apktool_path = ${GAME:tool_path}apktool\
heidisql_path = ${GAME:tool_path}HeidiSQL\heidisql.exe
notepad3_path = ${GAME:tool_path}Notepad3\Notepad3.exe
composer_path = ${GAME:tool_path}Composer\
+java_path = ${GAME:tool_path}jdk-8\
+msvbcrt_path = ${GAME:tool_path}Other\MSVBCRT.exe
[OTHER]
about = shileiye
diff --git a/dist/main.exe b/dist/main.exe
index 78a7aa5..4274017 100644
Binary files a/dist/main.exe and b/dist/main.exe differ
diff --git a/main.spec b/main.spec
index b16def4..a2e8d9c 100644
--- a/main.spec
+++ b/main.spec
@@ -5,7 +5,7 @@ block_cipher = None
a = Analysis(['main.py'],
- pathex=['D:\\soft\\Python\\Python39\\Lib\\site-packages', 'D:\\soft\\Python\\Python39\\Lib', 'D:\\soft\\Python\\Python39\\Lib\\site-packages\\PyQt5\\Qt\\bin', 'D:\\Code\\python\\onekey\\venv\\Lib\\site-packages', ''],
+ pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
diff --git a/readme.md b/readme.md
index e6c7e64..3f0736e 100644
--- a/readme.md
+++ b/readme.md
@@ -2,5 +2,5 @@
### 打包命令
```python
-pyinstaller -F -w -p D:\soft\Python\Python39\Lib\site-packages;D:\soft\Python\Python39\Lib;D:\soft\Python\Python39\Lib\site-packages\PyQt5\Qt\bin;D:\Code\python\onekey\venv\Lib\site-packages; main.py
+pyinstaller -F -w -p D:\soft\Python\Python39\Lib\site-packages;D:\soft\Python\Python39\Lib;D:\soft\Python\Python39\Lib\site-packages\PyQt5\Qt\bin;D:\Code\python\onekey\venv\Lib\site-packages; .\main.py
```
\ No newline at end of file
diff --git a/venv/Lib/site-packages/_distutils_hack/__init__.py b/venv/Lib/site-packages/_distutils_hack/__init__.py
index 22bc9ed..c0170d0 100644
--- a/venv/Lib/site-packages/_distutils_hack/__init__.py
+++ b/venv/Lib/site-packages/_distutils_hack/__init__.py
@@ -3,6 +3,7 @@ import os
import re
import importlib
import warnings
+import contextlib
is_pypy = '__pypy__' in sys.builtin_module_names
@@ -52,9 +53,8 @@ def ensure_local_distutils():
# With the DistutilsMetaFinder in place,
# perform an import to cause distutils to be
# loaded from setuptools._distutils. Ref #2906.
- add_shim()
- importlib.import_module('distutils')
- remove_shim()
+ with shim():
+ importlib.import_module('distutils')
# check that submodules load as expected
core = importlib.import_module('distutils.core')
@@ -86,10 +86,23 @@ class DistutilsMetaFinder:
import importlib.abc
import importlib.util
+ try:
+ mod = importlib.import_module('setuptools._distutils')
+ except Exception:
+ # There are a couple of cases where setuptools._distutils
+ # may not be present:
+ # - An older Setuptools without a local distutils is
+ # taking precedence. Ref #2957.
+ # - Path manipulation during sitecustomize removes
+ # setuptools from the path but only after the hook
+ # has been loaded. Ref #2980.
+ # In either case, fall back to stdlib behavior.
+ return
+
class DistutilsLoader(importlib.abc.Loader):
def create_module(self, spec):
- return importlib.import_module('setuptools._distutils')
+ return mod
def exec_module(self, module):
pass
@@ -130,6 +143,19 @@ DISTUTILS_FINDER = DistutilsMetaFinder()
def add_shim():
+ DISTUTILS_FINDER in sys.meta_path or insert_shim()
+
+
+@contextlib.contextmanager
+def shim():
+ insert_shim()
+ try:
+ yield
+ finally:
+ remove_shim()
+
+
+def insert_shim():
sys.meta_path.insert(0, DISTUTILS_FINDER)
diff --git a/venv/Lib/site-packages/psutil-5.8.0.dist-info/INSTALLER b/venv/Lib/site-packages/psutil-5.8.0.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/venv/Lib/site-packages/psutil-5.8.0.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/venv/Lib/site-packages/psutil-5.8.0.dist-info/LICENSE b/venv/Lib/site-packages/psutil-5.8.0.dist-info/LICENSE
deleted file mode 100644
index 0bf4a7f..0000000
--- a/venv/Lib/site-packages/psutil-5.8.0.dist-info/LICENSE
+++ /dev/null
@@ -1,29 +0,0 @@
-BSD 3-Clause License
-
-Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola'
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- * Neither the name of the psutil authors nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/venv/Lib/site-packages/psutil-5.8.0.dist-info/METADATA b/venv/Lib/site-packages/psutil-5.8.0.dist-info/METADATA
deleted file mode 100644
index e0d5c4d..0000000
--- a/venv/Lib/site-packages/psutil-5.8.0.dist-info/METADATA
+++ /dev/null
@@ -1,560 +0,0 @@
-Metadata-Version: 2.1
-Name: psutil
-Version: 5.8.0
-Summary: Cross-platform lib for process and system monitoring in Python.
-Home-page: https://github.com/giampaolo/psutil
-Author: Giampaolo Rodola
-Author-email: g.rodola@gmail.com
-License: BSD
-Keywords: ps,top,kill,free,lsof,netstat,nice,tty,ionice,uptime,taskmgr,process,df,iotop,iostat,ifconfig,taskset,who,pidof,pmap,smem,pstree,monitoring,ulimit,prlimit,smem,performance,metrics,agent,observability
-Platform: Platform Independent
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Environment :: Console
-Classifier: Environment :: Win32 (MS Windows)
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: Information Technology
-Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: BSD License
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft :: Windows :: Windows 10
-Classifier: Operating System :: Microsoft :: Windows :: Windows 7
-Classifier: Operating System :: Microsoft :: Windows :: Windows 8
-Classifier: Operating System :: Microsoft :: Windows :: Windows 8.1
-Classifier: Operating System :: Microsoft :: Windows :: Windows Server 2003
-Classifier: Operating System :: Microsoft :: Windows :: Windows Server 2008
-Classifier: Operating System :: Microsoft :: Windows :: Windows Vista
-Classifier: Operating System :: Microsoft
-Classifier: Operating System :: OS Independent
-Classifier: Operating System :: POSIX :: AIX
-Classifier: Operating System :: POSIX :: BSD :: FreeBSD
-Classifier: Operating System :: POSIX :: BSD :: NetBSD
-Classifier: Operating System :: POSIX :: BSD :: OpenBSD
-Classifier: Operating System :: POSIX :: BSD
-Classifier: Operating System :: POSIX :: Linux
-Classifier: Operating System :: POSIX :: SunOS/Solaris
-Classifier: Operating System :: POSIX
-Classifier: Programming Language :: C
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Programming Language :: Python
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: Software Development :: Libraries
-Classifier: Topic :: System :: Benchmark
-Classifier: Topic :: System :: Hardware :: Hardware Drivers
-Classifier: Topic :: System :: Hardware
-Classifier: Topic :: System :: Monitoring
-Classifier: Topic :: System :: Networking :: Monitoring :: Hardware Watchdog
-Classifier: Topic :: System :: Networking :: Monitoring
-Classifier: Topic :: System :: Networking
-Classifier: Topic :: System :: Operating System
-Classifier: Topic :: System :: Systems Administration
-Classifier: Topic :: Utilities
-Requires-Python: >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
-Description-Content-Type: text/x-rst
-Provides-Extra: test
-Requires-Dist: ipaddress ; (python_version < "3.0") and extra == 'test'
-Requires-Dist: mock ; (python_version < "3.0") and extra == 'test'
-Requires-Dist: unittest2 ; (python_version < "3.0") and extra == 'test'
-Requires-Dist: enum34 ; (python_version <= "3.4") and extra == 'test'
-Requires-Dist: pywin32 ; (sys_platform == "win32") and extra == 'test'
-Requires-Dist: wmi ; (sys_platform == "win32") and extra == 'test'
-
-| |downloads| |stars| |forks| |contributors| |coverage| |quality|
-| |version| |py-versions| |packages| |license|
-| |github-actions| |appveyor| |doc| |twitter| |tidelift|
-
-.. |downloads| image:: https://img.shields.io/pypi/dm/psutil.svg
- :target: https://pepy.tech/project/psutil
- :alt: Downloads
-
-.. |stars| image:: https://img.shields.io/github/stars/giampaolo/psutil.svg
- :target: https://github.com/giampaolo/psutil/stargazers
- :alt: Github stars
-
-.. |forks| image:: https://img.shields.io/github/forks/giampaolo/psutil.svg
- :target: https://github.com/giampaolo/psutil/network/members
- :alt: Github forks
-
-.. |contributors| image:: https://img.shields.io/github/contributors/giampaolo/psutil.svg
- :target: https://github.com/giampaolo/psutil/graphs/contributors
- :alt: Contributors
-
-.. |quality| image:: https://img.shields.io/codacy/grade/ce63e7f7f69d44b5b59682196e6fbfca.svg
- :target: https://www.codacy.com/app/g-rodola/psutil?utm_source=github.com&utm_medium=referral&utm_content=giampaolo/psutil&utm_campaign=Badge_Grade
- :alt: Code quality
-
-.. |github-actions| image:: https://img.shields.io/github/workflow/status/giampaolo/psutil/CI?label=Linux%2C%20macOS%2C%20FreeBSD
- :target: https://github.com/giampaolo/psutil/actions?query=workflow%3ACI
- :alt: Linux, macOS, Windows tests
-
-.. |appveyor| image:: https://img.shields.io/appveyor/ci/giampaolo/psutil/master.svg?maxAge=3600&label=Windows
- :target: https://ci.appveyor.com/project/giampaolo/psutil
- :alt: Windows tests (Appveyor)
-
-.. |coverage| image:: https://coveralls.io/repos/github/giampaolo/psutil/badge.svg?branch=master
- :target: https://coveralls.io/github/giampaolo/psutil?branch=master
- :alt: Test coverage (coverall.io)
-
-.. |doc| image:: https://readthedocs.org/projects/psutil/badge/?version=latest
- :target: http://psutil.readthedocs.io/en/latest/?badge=latest
- :alt: Documentation Status
-
-.. |version| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi
- :target: https://pypi.org/project/psutil
- :alt: Latest version
-
-.. |py-versions| image:: https://img.shields.io/pypi/pyversions/psutil.svg
- :target: https://pypi.org/project/psutil
- :alt: Supported Python versions
-
-.. |packages| image:: https://repology.org/badge/tiny-repos/python:psutil.svg
- :target: https://repology.org/metapackage/python:psutil/versions
- :alt: Binary packages
-
-.. |license| image:: https://img.shields.io/pypi/l/psutil.svg
- :target: https://github.com/giampaolo/psutil/blob/master/LICENSE
- :alt: License
-
-.. |twitter| image:: https://img.shields.io/twitter/follow/grodola.svg?label=follow&style=flat&logo=twitter&logoColor=4FADFF
- :target: https://twitter.com/grodola
- :alt: Twitter Follow
-
-.. |tidelift| image:: https://tidelift.com/badges/github/giampaolo/psutil?style=flat
- :target: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme
- :alt: Tidelift
-
------
-
-Quick links
-===========
-
-- `Home page `_
-- `Install `_
-- `Documentation `_
-- `Download `_
-- `Forum `_
-- `StackOverflow `_
-- `Blog `_
-- `What's new `_
-
-
-Summary
-=======
-
-psutil (process and system utilities) is a cross-platform library for
-retrieving information on **running processes** and **system utilization**
-(CPU, memory, disks, network, sensors) in Python.
-It is useful mainly for **system monitoring**, **profiling and limiting process
-resources** and **management of running processes**.
-It implements many functionalities offered by classic UNIX command line tools
-such as *ps, top, iotop, lsof, netstat, ifconfig, free* and others.
-psutil currently supports the following platforms:
-
-- **Linux**
-- **Windows**
-- **macOS**
-- **FreeBSD, OpenBSD**, **NetBSD**
-- **Sun Solaris**
-- **AIX**
-
-Supported Python versions are **2.6**, **2.7**, **3.4+** and
-`PyPy `__.
-
-Funding
-=======
-
-While psutil is free software and will always be, the project would benefit
-immensely from some funding.
-Keeping up with bug reports and maintenance has become hardly sustainable for
-me alone in terms of time.
-If you're a company that's making significant use of psutil you can consider
-becoming a sponsor via `GitHub `__,
-`Open Collective `__ or
-`PayPal `__
-and have your logo displayed in here and psutil `doc `__.
-
-Sponsors
-========
-
-.. image:: https://github.com/giampaolo/psutil/raw/master/docs/_static/tidelift-logo.png
- :width: 200
- :alt: Alternative text
-
-`Add your logo `__.
-
-Example usages
-==============
-
-This represents pretty much the whole psutil API.
-
-CPU
----
-
-.. code-block:: python
-
- >>> import psutil
- >>>
- >>> psutil.cpu_times()
- scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, nice=0.0)
- >>>
- >>> for x in range(3):
- ... psutil.cpu_percent(interval=1)
- ...
- 4.0
- 5.9
- 3.8
- >>>
- >>> for x in range(3):
- ... psutil.cpu_percent(interval=1, percpu=True)
- ...
- [4.0, 6.9, 3.7, 9.2]
- [7.0, 8.5, 2.4, 2.1]
- [1.2, 9.0, 9.9, 7.2]
- >>>
- >>> for x in range(3):
- ... psutil.cpu_times_percent(interval=1, percpu=False)
- ...
- scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
- scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
- scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
- >>>
- >>> psutil.cpu_count()
- 4
- >>> psutil.cpu_count(logical=False)
- 2
- >>>
- >>> psutil.cpu_stats()
- scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0)
- >>>
- >>> psutil.cpu_freq()
- scpufreq(current=931.42925, min=800.0, max=3500.0)
- >>>
- >>> psutil.getloadavg() # also on Windows (emulated)
- (3.14, 3.89, 4.67)
-
-Memory
-------
-
-.. code-block:: python
-
- >>> psutil.virtual_memory()
- svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304)
- >>> psutil.swap_memory()
- sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944)
- >>>
-
-Disks
------
-
-.. code-block:: python
-
- >>> psutil.disk_partitions()
- [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid', maxfile=255, maxpath=4096),
- sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext, opts='rw', maxfile=255, maxpath=4096)]
- >>>
- >>> psutil.disk_usage('/')
- sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
- >>>
- >>> psutil.disk_io_counters(perdisk=False)
- sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412)
- >>>
-
-Network
--------
-
-.. code-block:: python
-
- >>> psutil.net_io_counters(pernic=True)
- {'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0),
- 'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)}
- >>>
- >>> psutil.net_connections(kind='tcp')
- [sconn(fd=115, family=, type=, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254),
- sconn(fd=117, family=, type=, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987),
- ...]
- >>>
- >>> psutil.net_if_addrs()
- {'lo': [snicaddr(family=, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None),
- snicaddr(family=, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
- snicaddr(family=, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)],
- 'wlan0': [snicaddr(family=, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None),
- snicaddr(family=, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),
- snicaddr(family=, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
- >>>
- >>> psutil.net_if_stats()
- {'lo': snicstats(isup=True, duplex=, speed=0, mtu=65536),
- 'wlan0': snicstats(isup=True, duplex=, speed=100, mtu=1500)}
- >>>
-
-Sensors
--------
-
-.. code-block:: python
-
- >>> import psutil
- >>> psutil.sensors_temperatures()
- {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],
- 'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],
- 'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),
- shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]}
- >>>
- >>> psutil.sensors_fans()
- {'asus': [sfan(label='cpu_fan', current=3200)]}
- >>>
- >>> psutil.sensors_battery()
- sbattery(percent=93, secsleft=16628, power_plugged=False)
- >>>
-
-Other system info
------------------
-
-.. code-block:: python
-
- >>> import psutil
- >>> psutil.users()
- [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352),
- suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]
- >>>
- >>> psutil.boot_time()
- 1365519115.0
- >>>
-
-Process management
-------------------
-
-.. code-block:: python
-
- >>> import psutil
- >>> psutil.pids()
- [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215,
- 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932,
- 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311,
- 4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433,
- 4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054,
- 7055, 7071]
- >>>
- >>> p = psutil.Process(7055)
- >>> p
- psutil.Process(pid=7055, name='python3', status='running', started='09:04:44')
- >>> p.name()
- 'python'
- >>> p.exe()
- '/usr/bin/python'
- >>> p.cwd()
- '/home/giampaolo'
- >>> p.cmdline()
- ['/usr/bin/python', 'main.py']
- >>>
- >>> p.pid
- 7055
- >>> p.ppid()
- 7054
- >>> p.children(recursive=True)
- [psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'),
- psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')]
- >>>
- >>> p.parent()
- psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44')
- >>> p.parents()
- [psutil.Process(pid=4699, name='bash', started='09:06:44'),
- psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'),
- psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')]
- >>>
- >>> p.status()
- 'running'
- >>> p.username()
- 'giampaolo'
- >>> p.create_time()
- 1267551141.5019531
- >>> p.terminal()
- '/dev/pts/0'
- >>>
- >>> p.uids()
- puids(real=1000, effective=1000, saved=1000)
- >>> p.gids()
- pgids(real=1000, effective=1000, saved=1000)
- >>>
- >>> p.cpu_times()
- pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0)
- >>> p.cpu_percent(interval=1.0)
- 12.1
- >>> p.cpu_affinity()
- [0, 1, 2, 3]
- >>> p.cpu_affinity([0, 1]) # set
- >>> p.cpu_num()
- 1
- >>>
- >>> p.memory_info()
- pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0)
- >>> p.memory_full_info() # "real" USS memory usage (Linux, macOS, Win only)
- pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0)
- >>> p.memory_percent()
- 0.7823
- >>> p.memory_maps()
- [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0),
- pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0),
- pmmap_grouped(path='[heap]', rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0),
- pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0),
- ...]
- >>>
- >>> p.io_counters()
- pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543)
- >>>
- >>> p.open_files()
- [popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768),
- popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)]
- >>>
- >>> p.connections(kind='tcp')
- [pconn(fd=115, family=, type=, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'),
- pconn(fd=117, family=, type=, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')]
- >>>
- >>> p.num_threads()
- 4
- >>> p.num_fds()
- 8
- >>> p.threads()
- [pthread(id=5234, user_time=22.5, system_time=9.2891),
- pthread(id=5237, user_time=0.0707, system_time=1.1)]
- >>>
- >>> p.num_ctx_switches()
- pctxsw(voluntary=78, involuntary=19)
- >>>
- >>> p.nice()
- 0
- >>> p.nice(10) # set
- >>>
- >>> p.ionice(psutil.IOPRIO_CLASS_IDLE) # IO priority (Win and Linux only)
- >>> p.ionice()
- pionice(ioclass=, value=0)
- >>>
- >>> p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) # set resource limits (Linux only)
- >>> p.rlimit(psutil.RLIMIT_NOFILE)
- (5, 5)
- >>>
- >>> p.environ()
- {'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto',
- 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg',
- ...}
- >>>
- >>> p.as_dict()
- {'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...}
- >>> p.is_running()
- True
- >>> p.suspend()
- >>> p.resume()
- >>>
- >>> p.terminate()
- >>> p.kill()
- >>> p.wait(timeout=3)
-
- >>>
- >>> psutil.test()
- USER PID %CPU %MEM VSZ RSS TTY START TIME COMMAND
- root 1 0.0 0.0 24584 2240 Jun17 00:00 init
- root 2 0.0 0.0 0 0 Jun17 00:00 kthreadd
- ...
- giampaolo 31475 0.0 0.0 20760 3024 /dev/pts/0 Jun19 00:00 python2.4
- giampaolo 31721 0.0 2.2 773060 181896 00:04 10:30 chrome
- root 31763 0.0 0.0 0 0 00:05 00:00 kworker/0:1
- >>>
-
-Further process APIs
---------------------
-
-.. code-block:: python
-
- >>> import psutil
- >>> for proc in psutil.process_iter(['pid', 'name']):
- ... print(proc.info)
- ...
- {'pid': 1, 'name': 'systemd'}
- {'pid': 2, 'name': 'kthreadd'}
- {'pid': 3, 'name': 'ksoftirqd/0'}
- ...
- >>>
- >>> psutil.pid_exists(3)
- True
- >>>
- >>> def on_terminate(proc):
- ... print("process {} terminated".format(proc))
- ...
- >>> # waits for multiple processes to terminate
- >>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate)
- >>>
-
-Popen wrapper:
-
-.. code-block:: python
-
- >>> import psutil
- >>> from subprocess import PIPE
- >>> p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"], stdout=PIPE)
- >>> p.name()
- 'python'
- >>> p.username()
- 'giampaolo'
- >>> p.communicate()
- ('hello\n', None)
- >>> p.wait(timeout=2)
- 0
- >>>
-
-Windows services
-----------------
-
-.. code-block:: python
-
- >>> list(psutil.win_service_iter())
- [,
- ,
- ,
- ,
- ...]
- >>> s = psutil.win_service_get('alg')
- >>> s.as_dict()
- {'binpath': 'C:\\Windows\\System32\\alg.exe',
- 'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',
- 'display_name': 'Application Layer Gateway Service',
- 'name': 'alg',
- 'pid': None,
- 'start_type': 'manual',
- 'status': 'stopped',
- 'username': 'NT AUTHORITY\\LocalService'}
-
-Projects using psutil
-=====================
-
-Here's some I find particularly interesting:
-
-- https://github.com/google/grr
-- https://github.com/facebook/osquery/
-- https://github.com/nicolargo/glances
-- https://github.com/Jahaja/psdash
-- https://github.com/ajenti/ajenti
-- https://github.com/home-assistant/home-assistant/
-
-Portings
-========
-
-- Go: https://github.com/shirou/gopsutil
-- C: https://github.com/hamon-in/cpslib
-- Rust: https://github.com/rust-psutil/rust-psutil
-- Nim: https://github.com/johnscillieri/psutil-nim
-
-Security
-========
-
-To report a security vulnerability, please use the `Tidelift security
-contact`_. Tidelift will coordinate the fix and disclosure.
-
-.. _`Giampaolo Rodola`: https://gmpy.dev/about
-.. _`donation`: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A9ZS7PKKRM3S8
-.. _Tidelift security contact: https://tidelift.com/security
-.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme
-
-
-
diff --git a/venv/Lib/site-packages/psutil-5.8.0.dist-info/RECORD b/venv/Lib/site-packages/psutil-5.8.0.dist-info/RECORD
deleted file mode 100644
index 9fe0b50..0000000
--- a/venv/Lib/site-packages/psutil-5.8.0.dist-info/RECORD
+++ /dev/null
@@ -1,64 +0,0 @@
-psutil-5.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-psutil-5.8.0.dist-info/LICENSE,sha256=JMEphFAMqgf_3OGe68BjlsXm0kS1c7xsQ49KbvjlbBs,1549
-psutil-5.8.0.dist-info/METADATA,sha256=Bphj_aWaN0I3HJ9grSaLCwTHYKWVx9Gh3lV9WQvyBeY,22626
-psutil-5.8.0.dist-info/RECORD,,
-psutil-5.8.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-psutil-5.8.0.dist-info/WHEEL,sha256=jr7ubY0Lkz_yXH9FfFe9PTtLhGOsf62dZkNvTYrJINE,100
-psutil-5.8.0.dist-info/top_level.txt,sha256=gCNhn57wzksDjSAISmgMJ0aiXzQulk0GJhb2-BAyYgw,7
-psutil/__init__.py,sha256=kBgynYzuxNXqFVpCNdTr0RqSmR-TqcHraDedB2ycPak,86749
-psutil/__pycache__/__init__.cpython-39.pyc,,
-psutil/__pycache__/_common.cpython-39.pyc,,
-psutil/__pycache__/_compat.cpython-39.pyc,,
-psutil/__pycache__/_psaix.cpython-39.pyc,,
-psutil/__pycache__/_psbsd.cpython-39.pyc,,
-psutil/__pycache__/_pslinux.cpython-39.pyc,,
-psutil/__pycache__/_psosx.cpython-39.pyc,,
-psutil/__pycache__/_psposix.cpython-39.pyc,,
-psutil/__pycache__/_pssunos.cpython-39.pyc,,
-psutil/__pycache__/_pswindows.cpython-39.pyc,,
-psutil/_common.py,sha256=Iej9ua0_H4c-lgmKx3xBWDHRP-Pb4szU-QNb8cN6d8M,26218
-psutil/_compat.py,sha256=wiGTaLFqCNUrCFvFfRXp4Y3gn5FiqzLUFVTCp6GA3tY,14474
-psutil/_psaix.py,sha256=0tYwysbZZOZshzh5Jlrmgh7yZBj9mARdKpfIEtSB2CM,18555
-psutil/_psbsd.py,sha256=wciWlLRNUfukUjld8xO-6MpO5D0q-3WxFQbeC9OKmlw,31069
-psutil/_pslinux.py,sha256=5YfU-zmscLdqxrm481q3_PFyrY8z0iQnRHjbLmY0nJ0,82101
-psutil/_psosx.py,sha256=SLUzYazQXOdIJ0yZjm-UqlDF-hJHy8yaDR4sljDeMCc,17494
-psutil/_psposix.py,sha256=IcXJTdU6osTJwjB2uDohCLnuGPl5BGQYD6vDg0sOJ8c,8045
-psutil/_pssunos.py,sha256=u3wVhSnBLtQFtCfhND1rxD2KHWB4zKaNIpmeCG5z5Mc,25495
-psutil/_psutil_windows.cp39-win_amd64.pyd,sha256=959nMupaNnUxLvS5UGvtjhWqLZxyLTDQyWJ0Z1qp3Gg,76288
-psutil/_pswindows.py,sha256=JyffHx0PmRJY-4FnL0eevPdmrnB7d96AuV6mTvUavPc,36841
-psutil/tests/__init__.py,sha256=6SFK_zga_qUnJOnKF6AIWasKGIYwd6XXqXg3KxJiX1Y,57568
-psutil/tests/__main__.py,sha256=bBfMPu_gPzyiA4gfAFSZLk7LyLSPTUIHQFU1kFcj_Ok,291
-psutil/tests/__pycache__/__init__.cpython-39.pyc,,
-psutil/tests/__pycache__/__main__.cpython-39.pyc,,
-psutil/tests/__pycache__/runner.cpython-39.pyc,,
-psutil/tests/__pycache__/test_aix.cpython-39.pyc,,
-psutil/tests/__pycache__/test_bsd.cpython-39.pyc,,
-psutil/tests/__pycache__/test_connections.cpython-39.pyc,,
-psutil/tests/__pycache__/test_contracts.cpython-39.pyc,,
-psutil/tests/__pycache__/test_linux.cpython-39.pyc,,
-psutil/tests/__pycache__/test_memleaks.cpython-39.pyc,,
-psutil/tests/__pycache__/test_misc.cpython-39.pyc,,
-psutil/tests/__pycache__/test_osx.cpython-39.pyc,,
-psutil/tests/__pycache__/test_posix.cpython-39.pyc,,
-psutil/tests/__pycache__/test_process.cpython-39.pyc,,
-psutil/tests/__pycache__/test_sunos.cpython-39.pyc,,
-psutil/tests/__pycache__/test_system.cpython-39.pyc,,
-psutil/tests/__pycache__/test_testutils.cpython-39.pyc,,
-psutil/tests/__pycache__/test_unicode.cpython-39.pyc,,
-psutil/tests/__pycache__/test_windows.cpython-39.pyc,,
-psutil/tests/runner.py,sha256=aWiBnzMuH42dGAeofRuOgmDPcyKI9Yr0u1PI4HLDPOE,11332
-psutil/tests/test_aix.py,sha256=r78PBazMdlagip3tnWdZIS6HxQNTirE9c8GWqPkcKTw,4526
-psutil/tests/test_bsd.py,sha256=3tTFVIkmXZFkHyaFydsmJH_-lsAEk1HuAAi3-LgBGJM,20695
-psutil/tests/test_connections.py,sha256=-4pjxtJGWobjidWEkuEFIS7SHA5eXvEcrj2MG51Fqb8,21434
-psutil/tests/test_contracts.py,sha256=ID5_K_GwlQLYJZdl3BbZcV-ZcnptwlfNx42mM7a58Kk,27097
-psutil/tests/test_linux.py,sha256=jEiPD5gSCrUiFOvau-sRncPO3StetoIlxPJcYzarTas,89802
-psutil/tests/test_memleaks.py,sha256=tDP4poPQeCdXcD5DayQ0uLb71Yy_bk0QlIYNdBl-ems,14796
-psutil/tests/test_misc.py,sha256=KyB__5fP8Lwt57ZirpFkWtPa3psX9S5D9zJQIR2dFl8,28584
-psutil/tests/test_osx.py,sha256=PAQf49HUiN8n0DKmUWCXCaEV-2h20m1jeuLX85pxsg8,7550
-psutil/tests/test_posix.py,sha256=qN0W3r760F5c6dGFTYKVsyNjG16wX_fpVs2k1K8CqSE,15143
-psutil/tests/test_process.py,sha256=bCcCqfc2JxKI9PvuW7mpFY599rxoMZKzkxDRT-Oms0k,59703
-psutil/tests/test_sunos.py,sha256=tosB6-4boM6ZlIVaeJZh6YbBY8gVGRm0YIXgb_Z69GU,1351
-psutil/tests/test_system.py,sha256=dT0v3X4ZZl1RO0ARYU_AkvNAzsGt21CIIQ9-_VvbQa4,35596
-psutil/tests/test_testutils.py,sha256=A9nneh29Z9rN7wM4ekBg4QdXL5diD4mCUI1Uw6B5jec,14420
-psutil/tests/test_unicode.py,sha256=cPwy2YUW8XV0U9oIsMCBFhS2SMu5htdFD3DTimmRtic,12459
-psutil/tests/test_windows.py,sha256=dkEkbFEUaI2L5syFte9vok42n_r_DsTjbFu6IZ6SzvQ,32589
diff --git a/venv/Lib/site-packages/psutil-5.8.0.dist-info/REQUESTED b/venv/Lib/site-packages/psutil-5.8.0.dist-info/REQUESTED
deleted file mode 100644
index e69de29..0000000
diff --git a/venv/Lib/site-packages/psutil-5.8.0.dist-info/WHEEL b/venv/Lib/site-packages/psutil-5.8.0.dist-info/WHEEL
deleted file mode 100644
index d1267fc..0000000
--- a/venv/Lib/site-packages/psutil-5.8.0.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.36.2)
-Root-Is-Purelib: false
-Tag: cp39-cp39-win_amd64
-
diff --git a/venv/Lib/site-packages/psutil-5.8.0.dist-info/top_level.txt b/venv/Lib/site-packages/psutil-5.8.0.dist-info/top_level.txt
deleted file mode 100644
index a4d92cc..0000000
--- a/venv/Lib/site-packages/psutil-5.8.0.dist-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-psutil
diff --git a/venv/Lib/site-packages/psutil/__init__.py b/venv/Lib/site-packages/psutil/__init__.py
index acd42ac..1a113bc 100644
--- a/venv/Lib/site-packages/psutil/__init__.py
+++ b/venv/Lib/site-packages/psutil/__init__.py
@@ -21,6 +21,7 @@ Works with Python versions from 2.6 to 3.4+.
"""
from __future__ import division
+
import collections
import contextlib
import datetime
@@ -31,24 +32,16 @@ import subprocess
import sys
import threading
import time
+
+
try:
import pwd
except ImportError:
pwd = None
from . import _common
-from ._common import AccessDenied
-from ._common import Error
-from ._common import memoize_when_activated
-from ._common import NoSuchProcess
-from ._common import TimeoutExpired
-from ._common import wrap_numbers as _wrap_numbers
-from ._common import ZombieProcess
-from ._compat import long
-from ._compat import PermissionError
-from ._compat import ProcessLookupError
-from ._compat import PY3 as _PY3
-
+from ._common import AIX
+from ._common import BSD
from ._common import CONN_CLOSE
from ._common import CONN_CLOSE_WAIT
from ._common import CONN_CLOSING
@@ -61,9 +54,16 @@ from ._common import CONN_NONE
from ._common import CONN_SYN_RECV
from ._common import CONN_SYN_SENT
from ._common import CONN_TIME_WAIT
+from ._common import FREEBSD # NOQA
+from ._common import LINUX
+from ._common import MACOS
+from ._common import NETBSD # NOQA
from ._common import NIC_DUPLEX_FULL
from ._common import NIC_DUPLEX_HALF
from ._common import NIC_DUPLEX_UNKNOWN
+from ._common import OPENBSD # NOQA
+from ._common import OSX # deprecated alias
+from ._common import POSIX # NOQA
from ._common import POWER_TIME_UNKNOWN
from ._common import POWER_TIME_UNLIMITED
from ._common import STATUS_DEAD
@@ -78,18 +78,21 @@ from ._common import STATUS_TRACING_STOP
from ._common import STATUS_WAITING
from ._common import STATUS_WAKING
from ._common import STATUS_ZOMBIE
-
-from ._common import AIX
-from ._common import BSD
-from ._common import FREEBSD # NOQA
-from ._common import LINUX
-from ._common import MACOS
-from ._common import NETBSD # NOQA
-from ._common import OPENBSD # NOQA
-from ._common import OSX # deprecated alias
-from ._common import POSIX # NOQA
from ._common import SUNOS
from ._common import WINDOWS
+from ._common import AccessDenied
+from ._common import Error
+from ._common import NoSuchProcess
+from ._common import TimeoutExpired
+from ._common import ZombieProcess
+from ._common import memoize_when_activated
+from ._common import wrap_numbers as _wrap_numbers
+from ._compat import PY3 as _PY3
+from ._compat import PermissionError
+from ._compat import ProcessLookupError
+from ._compat import SubprocessTimeoutExpired as _SubprocessTimeoutExpired
+from ._compat import long
+
if LINUX:
# This is public API and it will be retrieved from _pslinux.py
@@ -97,7 +100,6 @@ if LINUX:
PROCFS_PATH = "/proc"
from . import _pslinux as _psplatform
-
from ._pslinux import IOPRIO_CLASS_BE # NOQA
from ._pslinux import IOPRIO_CLASS_IDLE # NOQA
from ._pslinux import IOPRIO_CLASS_NONE # NOQA
@@ -112,10 +114,10 @@ elif WINDOWS:
from ._psutil_windows import NORMAL_PRIORITY_CLASS # NOQA
from ._psutil_windows import REALTIME_PRIORITY_CLASS # NOQA
from ._pswindows import CONN_DELETE_TCB # NOQA
- from ._pswindows import IOPRIO_VERYLOW # NOQA
+ from ._pswindows import IOPRIO_HIGH # NOQA
from ._pswindows import IOPRIO_LOW # NOQA
from ._pswindows import IOPRIO_NORMAL # NOQA
- from ._pswindows import IOPRIO_HIGH # NOQA
+ from ._pswindows import IOPRIO_VERYLOW # NOQA
elif MACOS:
from . import _psosx as _psplatform
@@ -209,7 +211,7 @@ if hasattr(_psplatform.Process, "rlimit"):
AF_LINK = _psplatform.AF_LINK
__author__ = "Giampaolo Rodola'"
-__version__ = "5.8.0"
+__version__ = "5.9.0"
version_info = tuple([int(num) for num in __version__.split('.')])
_timer = getattr(time, 'monotonic', time.time)
@@ -268,7 +270,11 @@ def _assert_pid_not_reused(fun):
@functools.wraps(fun)
def wrapper(self, *args, **kwargs):
if not self.is_running():
- raise NoSuchProcess(self.pid, self._name)
+ if self._pid_reused:
+ msg = "process no longer exists and its PID has been reused"
+ else:
+ msg = None
+ raise NoSuchProcess(self.pid, self._name, msg=msg)
return fun(self, *args, **kwargs)
return wrapper
@@ -339,6 +345,7 @@ class Process(object):
self._exe = None
self._create_time = None
self._gone = False
+ self._pid_reused = False
self._hash = None
self._lock = threading.RLock()
# used for caching on Windows only (on POSIX ppid may change)
@@ -363,8 +370,7 @@ class Process(object):
pass
except NoSuchProcess:
if not _ignore_nsp:
- msg = 'no process found with pid %s' % pid
- raise NoSuchProcess(pid, None, msg)
+ raise NoSuchProcess(pid, msg='process PID not found')
else:
self._gone = True
# This pair is supposed to indentify a Process instance
@@ -570,7 +576,7 @@ class Process(object):
It also checks if PID has been reused by another process in
which case return False.
"""
- if self._gone:
+ if self._gone or self._pid_reused:
return False
try:
# Checking if PID is alive is not enough as the PID might
@@ -578,7 +584,8 @@ class Process(object):
# verify process identity.
# Process identity / uniqueness over time is guaranteed by
# (PID + creation time) and that is verified in __eq__.
- return self == Process(self.pid)
+ self._pid_reused = self != Process(self.pid)
+ return not self._pid_reused
except ZombieProcess:
# We should never get here as it's already handled in
# Process.__init__; here just for extra safety.
@@ -1386,7 +1393,6 @@ def pid_exists(pid):
_pmap = {}
-_lock = threading.Lock()
def process_iter(attrs=None, ad_value=None):
@@ -1410,58 +1416,59 @@ def process_iter(attrs=None, ad_value=None):
If *attrs* is an empty list it will retrieve all process info
(slow).
"""
+ global _pmap
+
def add(pid):
proc = Process(pid)
if attrs is not None:
proc.info = proc.as_dict(attrs=attrs, ad_value=ad_value)
- with _lock:
- _pmap[proc.pid] = proc
+ pmap[proc.pid] = proc
return proc
def remove(pid):
- with _lock:
- _pmap.pop(pid, None)
+ pmap.pop(pid, None)
+ pmap = _pmap.copy()
a = set(pids())
- b = set(_pmap.keys())
+ b = set(pmap.keys())
new_pids = a - b
gone_pids = b - a
for pid in gone_pids:
remove(pid)
-
- with _lock:
- ls = sorted(list(_pmap.items()) +
- list(dict.fromkeys(new_pids).items()))
-
- for pid, proc in ls:
- try:
- if proc is None: # new process
- yield add(pid)
- else:
- # use is_running() to check whether PID has been reused by
- # another process in which case yield a new Process instance
- if proc.is_running():
- if attrs is not None:
- proc.info = proc.as_dict(
- attrs=attrs, ad_value=ad_value)
- yield proc
- else:
+ try:
+ ls = sorted(list(pmap.items()) + list(dict.fromkeys(new_pids).items()))
+ for pid, proc in ls:
+ try:
+ if proc is None: # new process
yield add(pid)
- except NoSuchProcess:
- remove(pid)
- except AccessDenied:
- # Process creation time can't be determined hence there's
- # no way to tell whether the pid of the cached process
- # has been reused. Just return the cached version.
- if proc is None and pid in _pmap:
- try:
- yield _pmap[pid]
- except KeyError:
- # If we get here it is likely that 2 threads were
- # using process_iter().
- pass
- else:
- raise
+ else:
+ # use is_running() to check whether PID has been
+ # reused by another process in which case yield a
+ # new Process instance
+ if proc.is_running():
+ if attrs is not None:
+ proc.info = proc.as_dict(
+ attrs=attrs, ad_value=ad_value)
+ yield proc
+ else:
+ yield add(pid)
+ except NoSuchProcess:
+ remove(pid)
+ except AccessDenied:
+ # Process creation time can't be determined hence there's
+ # no way to tell whether the pid of the cached process
+ # has been reused. Just return the cached version.
+ if proc is None and pid in pmap:
+ try:
+ yield pmap[pid]
+ except KeyError:
+ # If we get here it is likely that 2 threads were
+ # using process_iter().
+ pass
+ else:
+ raise
+ finally:
+ _pmap = pmap
def wait_procs(procs, timeout=None, callback=None):
@@ -1505,6 +1512,8 @@ def wait_procs(procs, timeout=None, callback=None):
returncode = proc.wait(timeout=timeout)
except TimeoutExpired:
pass
+ except _SubprocessTimeoutExpired:
+ pass
else:
if returncode is not None or not proc.is_running():
# Set new Process instance attribute.
@@ -1575,7 +1584,7 @@ def cpu_count(logical=True):
if logical:
ret = _psplatform.cpu_count_logical()
else:
- ret = _psplatform.cpu_count_physical()
+ ret = _psplatform.cpu_count_cores()
if ret is not None and ret < 1:
ret = None
return ret
@@ -1721,7 +1730,6 @@ def cpu_percent(interval=None, percpu=False):
def calculate(t1, t2):
times_delta = _cpu_times_deltas(t1, t2)
-
all_delta = _cpu_tot_time(times_delta)
busy_delta = _cpu_busy_time(times_delta)
@@ -1849,7 +1857,7 @@ def cpu_stats():
if hasattr(_psplatform, "cpu_freq"):
def cpu_freq(percpu=False):
- """Return CPU frequency as a nameduple including current,
+ """Return CPU frequency as a namedtuple including current,
min and max frequency expressed in Mhz.
If *percpu* is True and the system supports per-cpu frequency
@@ -2338,6 +2346,15 @@ if WINDOWS:
# =====================================================================
+def _set_debug(value):
+ """Enable or disable PSUTIL_DEBUG option, which prints debugging
+ messages to stderr.
+ """
+ import psutil._common
+ psutil._common.PSUTIL_DEBUG = bool(value)
+ _psplatform.cext.set_debug(bool(value))
+
+
def test(): # pragma: no cover
from ._common import bytes2human
from ._compat import get_terminal_size
diff --git a/venv/Lib/site-packages/psutil/_common.py b/venv/Lib/site-packages/psutil/_common.py
index 771461d..16d3b3b 100644
--- a/venv/Lib/site-packages/psutil/_common.py
+++ b/venv/Lib/site-packages/psutil/_common.py
@@ -7,8 +7,10 @@
# Note: this module is imported by setup.py so it should not import
# psutil or third-party modules.
-from __future__ import division, print_function
+from __future__ import division
+from __future__ import print_function
+import collections
import contextlib
import errno
import functools
@@ -18,12 +20,12 @@ import stat
import sys
import threading
import warnings
-from collections import defaultdict
from collections import namedtuple
from socket import AF_INET
from socket import SOCK_DGRAM
from socket import SOCK_STREAM
+
try:
from socket import AF_INET6
except ImportError:
@@ -41,6 +43,7 @@ else:
# can't take it from _common.py as this script is imported by setup.py
PY3 = sys.version_info[0] == 3
+PSUTIL_DEBUG = bool(os.getenv('PSUTIL_DEBUG', 0))
__all__ = [
# OS constants
@@ -83,7 +86,7 @@ WINDOWS = os.name == "nt"
LINUX = sys.platform.startswith("linux")
MACOS = sys.platform.startswith("darwin")
OSX = MACOS # deprecated alias
-FREEBSD = sys.platform.startswith("freebsd")
+FREEBSD = sys.platform.startswith(("freebsd", "midnightbsd"))
OPENBSD = sys.platform.startswith("openbsd")
NETBSD = sys.platform.startswith("netbsd")
BSD = FREEBSD or OPENBSD or NETBSD
@@ -275,15 +278,32 @@ class Error(Exception):
"""
__module__ = 'psutil'
- def __init__(self, msg=""):
- Exception.__init__(self, msg)
- self.msg = msg
+ def _infodict(self, attrs):
+ try:
+ info = collections.OrderedDict()
+ except AttributeError: # pragma: no cover
+ info = {} # Python 2.6
+ for name in attrs:
+ value = getattr(self, name, None)
+ if value:
+ info[name] = value
+ return info
+
+ def __str__(self):
+ # invoked on `raise Error`
+ info = self._infodict(("pid", "ppid", "name"))
+ if info:
+ details = "(%s)" % ", ".join(
+ ["%s=%r" % (k, v) for k, v in info.items()])
+ else:
+ details = None
+ return " ".join([x for x in (self.msg, details) if x])
def __repr__(self):
- ret = "psutil.%s %s" % (self.__class__.__name__, self.msg)
- return ret.strip()
-
- __str__ = __repr__
+ # invoked on `repr(Error)`
+ info = self._infodict(("pid", "ppid", "name", "seconds", "msg"))
+ details = ", ".join(["%s=%r" % (k, v) for k, v in info.items()])
+ return "psutil.%s(%s)" % (self.__class__.__name__, details)
class NoSuchProcess(Error):
@@ -293,16 +313,10 @@ class NoSuchProcess(Error):
__module__ = 'psutil'
def __init__(self, pid, name=None, msg=None):
- Error.__init__(self, msg)
+ Error.__init__(self)
self.pid = pid
self.name = name
- self.msg = msg
- if msg is None:
- if name:
- details = "(pid=%s, name=%s)" % (self.pid, repr(self.name))
- else:
- details = "(pid=%s)" % self.pid
- self.msg = "process no longer exists " + details
+ self.msg = msg or "process no longer exists"
class ZombieProcess(NoSuchProcess):
@@ -315,19 +329,9 @@ class ZombieProcess(NoSuchProcess):
__module__ = 'psutil'
def __init__(self, pid, name=None, ppid=None, msg=None):
- NoSuchProcess.__init__(self, msg)
- self.pid = pid
+ NoSuchProcess.__init__(self, pid, name, msg)
self.ppid = ppid
- self.name = name
- self.msg = msg
- if msg is None:
- args = ["pid=%s" % pid]
- if name:
- args.append("name=%s" % repr(self.name))
- if ppid:
- args.append("ppid=%s" % self.ppid)
- details = "(%s)" % ", ".join(args)
- self.msg = "process still exists but it's a zombie " + details
+ self.msg = msg or "PID still exists but it's a zombie"
class AccessDenied(Error):
@@ -335,17 +339,10 @@ class AccessDenied(Error):
__module__ = 'psutil'
def __init__(self, pid=None, name=None, msg=None):
- Error.__init__(self, msg)
+ Error.__init__(self)
self.pid = pid
self.name = name
- self.msg = msg
- if msg is None:
- if (pid is not None) and (name is not None):
- self.msg = "(pid=%s, name=%s)" % (pid, repr(name))
- elif (pid is not None):
- self.msg = "(pid=%s)" % self.pid
- else:
- self.msg = ""
+ self.msg = msg or ""
class TimeoutExpired(Error):
@@ -355,14 +352,11 @@ class TimeoutExpired(Error):
__module__ = 'psutil'
def __init__(self, seconds, pid=None, name=None):
- Error.__init__(self, "timeout after %s seconds" % seconds)
+ Error.__init__(self)
self.seconds = seconds
self.pid = pid
self.name = name
- if (pid is not None) and (name is not None):
- self.msg += " (pid=%s, name=%s)" % (pid, repr(name))
- elif (pid is not None):
- self.msg += " (pid=%s)" % self.pid
+ self.msg = "timeout after %s seconds" % seconds
# ===================================================================
@@ -451,7 +445,13 @@ def memoize_when_activated(fun):
except KeyError:
# case 3: we entered oneshot() ctx but there's no cache
# for this entry yet
- ret = self._cache[fun] = fun(self)
+ ret = fun(self)
+ try:
+ self._cache[fun] = ret
+ except AttributeError:
+ # multi-threading race condition, see:
+ # https://github.com/giampaolo/psutil/issues/1948
+ pass
return ret
def cache_activate(proc):
@@ -622,8 +622,8 @@ class _WrapNumbers:
assert name not in self.reminders
assert name not in self.reminder_keys
self.cache[name] = input_dict
- self.reminders[name] = defaultdict(int)
- self.reminder_keys[name] = defaultdict(set)
+ self.reminders[name] = collections.defaultdict(int)
+ self.reminder_keys[name] = collections.defaultdict(set)
def _remove_dead_reminders(self, input_dict, name):
"""In case the number of keys changed between calls (e.g. a
@@ -832,15 +832,17 @@ def print_color(
SetConsoleTextAttribute(handle, DEFAULT_COLOR)
-if bool(os.getenv('PSUTIL_DEBUG', 0)):
- import inspect
-
- def debug(msg):
- """If PSUTIL_DEBUG env var is set, print a debug message to stderr."""
+def debug(msg):
+ """If PSUTIL_DEBUG env var is set, print a debug message to stderr."""
+ if PSUTIL_DEBUG:
+ import inspect
fname, lineno, func_name, lines, index = inspect.getframeinfo(
inspect.currentframe().f_back)
+ if isinstance(msg, Exception):
+ if isinstance(msg, (OSError, IOError, EnvironmentError)):
+ # ...because str(exc) may contain info about the file name
+ msg = "ignoring %s" % msg
+ else:
+ msg = "ignoring %r" % msg
print("psutil-debug [%s:%s]> %s" % (fname, lineno, msg), # NOQA
file=sys.stderr)
-else:
- def debug(msg):
- pass
diff --git a/venv/Lib/site-packages/psutil/_compat.py b/venv/Lib/site-packages/psutil/_compat.py
index 17f3848..251e595 100644
--- a/venv/Lib/site-packages/psutil/_compat.py
+++ b/venv/Lib/site-packages/psutil/_compat.py
@@ -8,12 +8,14 @@ Python 3 way of doing things).
"""
import collections
+import contextlib
import errno
import functools
import os
import sys
import types
+
__all__ = [
# constants
"PY3",
@@ -25,6 +27,8 @@ __all__ = [
"lru_cache",
# shutil module
"which", "get_terminal_size",
+ # contextlib module
+ "redirect_stderr",
# python 3 exceptions
"FileNotFoundError", "PermissionError", "ProcessLookupError",
"InterruptedError", "ChildProcessError", "FileExistsError"]
@@ -410,8 +414,8 @@ except ImportError:
def get_terminal_size(fallback=(80, 24)):
try:
import fcntl
- import termios
import struct
+ import termios
except ImportError:
return fallback
else:
@@ -422,3 +426,25 @@ except ImportError:
return (res[1], res[0])
except Exception:
return fallback
+
+
+# python 3.3
+try:
+ from subprocess import TimeoutExpired as SubprocessTimeoutExpired
+except ImportError:
+ class SubprocessTimeoutExpired:
+ pass
+
+
+# python 3.5
+try:
+ from contextlib import redirect_stderr
+except ImportError:
+ @contextlib.contextmanager
+ def redirect_stderr(new_target):
+ original = getattr(sys, "stderr")
+ try:
+ setattr(sys, "stderr", new_target)
+ yield new_target
+ finally:
+ setattr(sys, "stderr", original)
diff --git a/venv/Lib/site-packages/psutil/_psaix.py b/venv/Lib/site-packages/psutil/_psaix.py
index 7160ecd..9cc7d56 100644
--- a/venv/Lib/site-packages/psutil/_psaix.py
+++ b/venv/Lib/site-packages/psutil/_psaix.py
@@ -18,20 +18,20 @@ from . import _common
from . import _psposix
from . import _psutil_aix as cext
from . import _psutil_posix as cext_posix
-from ._common import AccessDenied
-from ._common import conn_to_ntuple
-from ._common import get_procfs_path
-from ._common import memoize_when_activated
from ._common import NIC_DUPLEX_FULL
from ._common import NIC_DUPLEX_HALF
from ._common import NIC_DUPLEX_UNKNOWN
+from ._common import AccessDenied
from ._common import NoSuchProcess
-from ._common import usage_percent
from ._common import ZombieProcess
+from ._common import conn_to_ntuple
+from ._common import get_procfs_path
+from ._common import memoize_when_activated
+from ._common import usage_percent
+from ._compat import PY3
from ._compat import FileNotFoundError
from ._compat import PermissionError
from ._compat import ProcessLookupError
-from ._compat import PY3
__extra__all__ = ["PROCFS_PATH"]
@@ -143,7 +143,7 @@ def cpu_count_logical():
return None
-def cpu_count_physical():
+def cpu_count_cores():
cmd = "lsdev -Cc processor"
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
diff --git a/venv/Lib/site-packages/psutil/_psbsd.py b/venv/Lib/site-packages/psutil/_psbsd.py
index 764463e..5288506 100644
--- a/venv/Lib/site-packages/psutil/_psbsd.py
+++ b/venv/Lib/site-packages/psutil/_psbsd.py
@@ -9,24 +9,24 @@ import errno
import functools
import os
import xml.etree.ElementTree as ET
-from collections import namedtuple
from collections import defaultdict
+from collections import namedtuple
from . import _common
from . import _psposix
from . import _psutil_bsd as cext
from . import _psutil_posix as cext_posix
+from ._common import FREEBSD
+from ._common import NETBSD
+from ._common import OPENBSD
from ._common import AccessDenied
+from ._common import NoSuchProcess
+from ._common import ZombieProcess
from ._common import conn_tmap
from ._common import conn_to_ntuple
-from ._common import FREEBSD
from ._common import memoize
from ._common import memoize_when_activated
-from ._common import NETBSD
-from ._common import NoSuchProcess
-from ._common import OPENBSD
from ._common import usage_percent
-from ._common import ZombieProcess
from ._compat import FileNotFoundError
from ._compat import PermissionError
from ._compat import ProcessLookupError
@@ -249,19 +249,19 @@ def cpu_count_logical():
if OPENBSD or NETBSD:
- def cpu_count_physical():
+ def cpu_count_cores():
# OpenBSD and NetBSD do not implement this.
return 1 if cpu_count_logical() == 1 else None
else:
- def cpu_count_physical():
- """Return the number of physical CPUs in the system."""
+ def cpu_count_cores():
+ """Return the number of CPU cores in the system."""
# From the C module we'll get an XML string similar to this:
# http://manpages.ubuntu.com/manpages/precise/man4/smp.4freebsd.html
# We may get None in case "sysctl kern.sched.topology_spec"
# is not supported on this BSD version, in which case we'll mimic
# os.cpu_count() and return None.
ret = None
- s = cext.cpu_count_phys()
+ s = cext.cpu_topology()
if s is not None:
# get rid of padding chars appended at the end of the string
index = s.rfind("")
@@ -274,8 +274,7 @@ else:
# needed otherwise it will memleak
root.clear()
if not ret:
- # If logical CPUs are 1 it's obvious we'll have only 1
- # physical CPU.
+ # If logical CPUs == 1 it's obvious we' have only 1 core.
if cpu_count_logical() == 1:
return 1
return ret
diff --git a/venv/Lib/site-packages/psutil/_pslinux.py b/venv/Lib/site-packages/psutil/_pslinux.py
index be43f08..5a35691 100644
--- a/venv/Lib/site-packages/psutil/_pslinux.py
+++ b/venv/Lib/site-packages/psutil/_pslinux.py
@@ -25,30 +25,31 @@ from . import _common
from . import _psposix
from . import _psutil_linux as cext
from . import _psutil_posix as cext_posix
+from ._common import NIC_DUPLEX_FULL
+from ._common import NIC_DUPLEX_HALF
+from ._common import NIC_DUPLEX_UNKNOWN
from ._common import AccessDenied
+from ._common import NoSuchProcess
+from ._common import ZombieProcess
from ._common import debug
from ._common import decode
from ._common import get_procfs_path
from ._common import isfile_strict
from ._common import memoize
from ._common import memoize_when_activated
-from ._common import NIC_DUPLEX_FULL
-from ._common import NIC_DUPLEX_HALF
-from ._common import NIC_DUPLEX_UNKNOWN
-from ._common import NoSuchProcess
from ._common import open_binary
from ._common import open_text
from ._common import parse_environ_block
from ._common import path_exists_strict
from ._common import supports_ipv6
from ._common import usage_percent
-from ._common import ZombieProcess
-from ._compat import b
-from ._compat import basestring
+from ._compat import PY3
from ._compat import FileNotFoundError
from ._compat import PermissionError
from ._compat import ProcessLookupError
-from ._compat import PY3
+from ._compat import b
+from ._compat import basestring
+
if sys.version_info >= (3, 4):
import enum
@@ -656,8 +657,8 @@ def cpu_count_logical():
return num
-def cpu_count_physical():
- """Return the number of physical cores in the system."""
+def cpu_count_cores():
+ """Return the number of CPU cores in the system."""
# Method #1
ls = set()
# These 2 files are the same but */core_cpus_list is newer while
@@ -719,6 +720,17 @@ def cpu_stats():
ctx_switches, interrupts, soft_interrupts, syscalls)
+def _cpu_get_cpuinfo_freq():
+ """Return current CPU frequency from cpuinfo if available.
+ """
+ ret = []
+ with open_binary('%s/cpuinfo' % get_procfs_path()) as f:
+ for line in f:
+ if line.lower().startswith(b'cpu mhz'):
+ ret.append(float(line.split(b':', 1)[1]))
+ return ret
+
+
if os.path.exists("/sys/devices/system/cpu/cpufreq/policy0") or \
os.path.exists("/sys/devices/system/cpu/cpu0/cpufreq"):
def cpu_freq():
@@ -726,20 +738,20 @@ if os.path.exists("/sys/devices/system/cpu/cpufreq/policy0") or \
Contrarily to other OSes, Linux updates these values in
real-time.
"""
- def get_path(num):
- for p in ("/sys/devices/system/cpu/cpufreq/policy%s" % num,
- "/sys/devices/system/cpu/cpu%s/cpufreq" % num):
- if os.path.exists(p):
- return p
-
+ cpuinfo_freqs = _cpu_get_cpuinfo_freq()
+ paths = \
+ glob.glob("/sys/devices/system/cpu/cpufreq/policy[0-9]*") or \
+ glob.glob("/sys/devices/system/cpu/cpu[0-9]*/cpufreq")
+ paths.sort(key=lambda x: int(re.search(r"[0-9]+", x).group()))
ret = []
- for n in range(cpu_count_logical()):
- path = get_path(n)
- if not path:
- continue
-
- pjoin = os.path.join
- curr = cat(pjoin(path, "scaling_cur_freq"), fallback=None)
+ pjoin = os.path.join
+ for i, path in enumerate(paths):
+ if len(paths) == len(cpuinfo_freqs):
+ # take cached value from cpuinfo if available, see:
+ # https://github.com/giampaolo/psutil/issues/1851
+ curr = cpuinfo_freqs[i]
+ else:
+ curr = cat(pjoin(path, "scaling_cur_freq"), fallback=None)
if curr is None:
# Likely an old RedHat, see:
# https://github.com/giampaolo/psutil/issues/1071
@@ -753,24 +765,12 @@ if os.path.exists("/sys/devices/system/cpu/cpufreq/policy0") or \
ret.append(_common.scpufreq(curr, min_, max_))
return ret
-elif os.path.exists("/proc/cpuinfo"):
+else:
def cpu_freq():
"""Alternate implementation using /proc/cpuinfo.
min and max frequencies are not available and are set to None.
"""
- ret = []
- with open_binary('%s/cpuinfo' % get_procfs_path()) as f:
- for line in f:
- if line.lower().startswith(b'cpu mhz'):
- key, value = line.split(b':', 1)
- ret.append(_common.scpufreq(float(value), 0., 0.))
- return ret
-
-else:
- def cpu_freq():
- """Dummy implementation when none of the above files are present.
- """
- return []
+ return [_common.scpufreq(x, 0., 0.) for x in _cpu_get_cpuinfo_freq()]
# =====================================================================
@@ -834,6 +834,10 @@ class Connections:
if err.errno == errno.EINVAL:
# not a link
continue
+ if err.errno == errno.ENAMETOOLONG:
+ # file name too long
+ debug(err)
+ continue
raise
else:
if inode.startswith('socket:['):
@@ -1080,6 +1084,8 @@ def net_if_stats():
# https://github.com/giampaolo/psutil/issues/1279
if err.errno != errno.ENODEV:
raise
+ else:
+ debug(err)
else:
ret[name] = _common.snicstats(isup, duplex_map[duplex], speed, mtu)
return ret
@@ -1188,6 +1194,80 @@ def disk_io_counters(perdisk=False):
return retdict
+class RootFsDeviceFinder:
+ """disk_partitions() may return partitions with device == "/dev/root"
+ or "rootfs". This container class uses different strategies to try to
+ obtain the real device path. Resources:
+ https://bootlin.com/blog/find-root-device/
+ https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/
+ """
+ __slots__ = ['major', 'minor']
+
+ def __init__(self):
+ dev = os.stat("/").st_dev
+ self.major = os.major(dev)
+ self.minor = os.minor(dev)
+
+ def ask_proc_partitions(self):
+ with open_text("%s/partitions" % get_procfs_path()) as f:
+ for line in f.readlines()[2:]:
+ fields = line.split()
+ if len(fields) < 4: # just for extra safety
+ continue
+ major = int(fields[0]) if fields[0].isdigit() else None
+ minor = int(fields[1]) if fields[1].isdigit() else None
+ name = fields[3]
+ if major == self.major and minor == self.minor:
+ if name: # just for extra safety
+ return "/dev/%s" % name
+
+ def ask_sys_dev_block(self):
+ path = "/sys/dev/block/%s:%s/uevent" % (self.major, self.minor)
+ with open_text(path) as f:
+ for line in f:
+ if line.startswith("DEVNAME="):
+ name = line.strip().rpartition("DEVNAME=")[2]
+ if name: # just for extra safety
+ return "/dev/%s" % name
+
+ def ask_sys_class_block(self):
+ needle = "%s:%s" % (self.major, self.minor)
+ files = glob.iglob("/sys/class/block/*/dev")
+ for file in files:
+ try:
+ f = open_text(file)
+ except FileNotFoundError: # race condition
+ continue
+ else:
+ with f:
+ data = f.read().strip()
+ if data == needle:
+ name = os.path.basename(os.path.dirname(file))
+ return "/dev/%s" % name
+
+ def find(self):
+ path = None
+ if path is None:
+ try:
+ path = self.ask_proc_partitions()
+ except (IOError, OSError) as err:
+ debug(err)
+ if path is None:
+ try:
+ path = self.ask_sys_dev_block()
+ except (IOError, OSError) as err:
+ debug(err)
+ if path is None:
+ try:
+ path = self.ask_sys_class_block()
+ except (IOError, OSError) as err:
+ debug(err)
+ # We use exists() because the "/dev/*" part of the path is hard
+ # coded, so we want to be sure.
+ if path is not None and os.path.exists(path):
+ return path
+
+
def disk_partitions(all=False):
"""Return mounted disk partitions as a list of namedtuples."""
fstypes = set()
@@ -1215,6 +1295,8 @@ def disk_partitions(all=False):
device, mountpoint, fstype, opts = partition
if device == 'none':
device = ''
+ if device in ("/dev/root", "rootfs"):
+ device = RootFsDeviceFinder().find() or device
if not all:
if device == '' or fstype not in fstypes:
continue
@@ -1310,7 +1392,7 @@ def sensors_temperatures():
path = os.path.join(base, 'type')
unit_name = cat(path, binary=False)
except (IOError, OSError, ValueError) as err:
- debug("ignoring %r for file %r" % (err, path))
+ debug(err)
continue
trip_paths = glob.glob(base + '/trip_point*')
@@ -1366,7 +1448,7 @@ def sensors_fans():
try:
current = int(cat(base + '_input'))
except (IOError, OSError) as err:
- warnings.warn("ignoring %r" % err, RuntimeWarning)
+ debug(err)
continue
unit_name = cat(os.path.join(os.path.dirname(base), 'name'),
binary=False)
@@ -1392,7 +1474,10 @@ def sensors_battery():
for path in paths:
ret = cat(path, fallback=null)
if ret != null:
- return int(ret) if ret.isdigit() else ret
+ try:
+ return int(ret)
+ except ValueError:
+ return ret
return None
bats = [x for x in os.listdir(POWER_SUPPLY_PATH) if x.startswith('BAT') or
@@ -2100,6 +2185,10 @@ class Process(object):
if err.errno == errno.EINVAL:
# not a link
continue
+ if err.errno == errno.ENAMETOOLONG:
+ # file name too long
+ debug(err)
+ continue
raise
else:
# If path is not an absolute there's no way to tell
diff --git a/venv/Lib/site-packages/psutil/_psosx.py b/venv/Lib/site-packages/psutil/_psosx.py
index c7770d6..ac8ecc5 100644
--- a/venv/Lib/site-packages/psutil/_psosx.py
+++ b/venv/Lib/site-packages/psutil/_psosx.py
@@ -4,7 +4,6 @@
"""macOS platform implementation."""
-import contextlib
import errno
import functools
import os
@@ -15,14 +14,14 @@ from . import _psposix
from . import _psutil_osx as cext
from . import _psutil_posix as cext_posix
from ._common import AccessDenied
+from ._common import NoSuchProcess
+from ._common import ZombieProcess
from ._common import conn_tmap
from ._common import conn_to_ntuple
from ._common import isfile_strict
from ._common import memoize_when_activated
-from ._common import NoSuchProcess
from ._common import parse_environ_block
from ._common import usage_percent
-from ._common import ZombieProcess
from ._compat import PermissionError
from ._compat import ProcessLookupError
@@ -159,9 +158,9 @@ def cpu_count_logical():
return cext.cpu_count_logical()
-def cpu_count_physical():
- """Return the number of physical CPUs in the system."""
- return cext.cpu_count_phys()
+def cpu_count_cores():
+ """Return the number of CPU cores in the system."""
+ return cext.cpu_count_cores()
def cpu_stats():
@@ -354,32 +353,6 @@ def wrap_exceptions(fun):
return wrapper
-@contextlib.contextmanager
-def catch_zombie(proc):
- """There are some poor C APIs which incorrectly raise ESRCH when
- the process is still alive or it's a zombie, or even RuntimeError
- (those who don't set errno). This is here in order to solve:
- https://github.com/giampaolo/psutil/issues/1044
- """
- try:
- yield
- except (OSError, RuntimeError) as err:
- if isinstance(err, RuntimeError) or err.errno == errno.ESRCH:
- try:
- # status() is not supposed to lie and correctly detect
- # zombies so if it raises ESRCH it's true.
- status = proc.status()
- except NoSuchProcess:
- raise err
- else:
- if status == _common.STATUS_ZOMBIE:
- raise ZombieProcess(proc.pid, proc._name, proc._ppid)
- else:
- raise AccessDenied(proc.pid, proc._name)
- else:
- raise
-
-
class Process(object):
"""Wrapper class around underlying C implementation."""
@@ -402,8 +375,7 @@ class Process(object):
@memoize_when_activated
def _get_pidtaskinfo(self):
# Note: should work for PIDs owned by user only.
- with catch_zombie(self):
- ret = cext.proc_pidtaskinfo_oneshot(self.pid)
+ ret = cext.proc_pidtaskinfo_oneshot(self.pid)
assert len(ret) == len(pidtaskinfo_map)
return ret
@@ -422,18 +394,15 @@ class Process(object):
@wrap_exceptions
def exe(self):
- with catch_zombie(self):
- return cext.proc_exe(self.pid)
+ return cext.proc_exe(self.pid)
@wrap_exceptions
def cmdline(self):
- with catch_zombie(self):
- return cext.proc_cmdline(self.pid)
+ return cext.proc_cmdline(self.pid)
@wrap_exceptions
def environ(self):
- with catch_zombie(self):
- return parse_environ_block(cext.proc_environ(self.pid))
+ return parse_environ_block(cext.proc_environ(self.pid))
@wrap_exceptions
def ppid(self):
@@ -442,8 +411,7 @@ class Process(object):
@wrap_exceptions
def cwd(self):
- with catch_zombie(self):
- return cext.proc_cwd(self.pid)
+ return cext.proc_cwd(self.pid)
@wrap_exceptions
def uids(self):
@@ -516,8 +484,7 @@ class Process(object):
if self.pid == 0:
return []
files = []
- with catch_zombie(self):
- rawlist = cext.proc_open_files(self.pid)
+ rawlist = cext.proc_open_files(self.pid)
for path, fd in rawlist:
if isfile_strict(path):
ntuple = _common.popenfile(path, fd)
@@ -530,8 +497,7 @@ class Process(object):
raise ValueError("invalid %r kind argument; choose between %s"
% (kind, ', '.join([repr(x) for x in conn_tmap])))
families, types = conn_tmap[kind]
- with catch_zombie(self):
- rawlist = cext.proc_connections(self.pid, families, types)
+ rawlist = cext.proc_connections(self.pid, families, types)
ret = []
for item in rawlist:
fd, fam, type, laddr, raddr, status = item
@@ -544,8 +510,7 @@ class Process(object):
def num_fds(self):
if self.pid == 0:
return 0
- with catch_zombie(self):
- return cext.proc_num_fds(self.pid)
+ return cext.proc_num_fds(self.pid)
@wrap_exceptions
def wait(self, timeout=None):
@@ -553,13 +518,11 @@ class Process(object):
@wrap_exceptions
def nice_get(self):
- with catch_zombie(self):
- return cext_posix.getpriority(self.pid)
+ return cext_posix.getpriority(self.pid)
@wrap_exceptions
def nice_set(self, value):
- with catch_zombie(self):
- return cext_posix.setpriority(self.pid, value)
+ return cext_posix.setpriority(self.pid, value)
@wrap_exceptions
def status(self):
diff --git a/venv/Lib/site-packages/psutil/_psposix.py b/venv/Lib/site-packages/psutil/_psposix.py
index 706dab9..8e6629d 100644
--- a/venv/Lib/site-packages/psutil/_psposix.py
+++ b/venv/Lib/site-packages/psutil/_psposix.py
@@ -10,18 +10,19 @@ import signal
import sys
import time
+from ._common import TimeoutExpired
from ._common import memoize
from ._common import sdiskusage
-from ._common import TimeoutExpired
from ._common import usage_percent
+from ._compat import PY3
from ._compat import ChildProcessError
from ._compat import FileNotFoundError
from ._compat import InterruptedError
from ._compat import PermissionError
from ._compat import ProcessLookupError
-from ._compat import PY3
from ._compat import unicode
+
if sys.version_info >= (3, 4):
import enum
else:
diff --git a/venv/Lib/site-packages/psutil/_pssunos.py b/venv/Lib/site-packages/psutil/_pssunos.py
index 5618bd4..69b579c 100644
--- a/venv/Lib/site-packages/psutil/_pssunos.py
+++ b/venv/Lib/site-packages/psutil/_pssunos.py
@@ -17,22 +17,22 @@ from . import _common
from . import _psposix
from . import _psutil_posix as cext_posix
from . import _psutil_sunos as cext
-from ._common import AccessDenied
from ._common import AF_INET6
+from ._common import AccessDenied
+from ._common import NoSuchProcess
+from ._common import ZombieProcess
from ._common import debug
from ._common import get_procfs_path
from ._common import isfile_strict
from ._common import memoize_when_activated
-from ._common import NoSuchProcess
from ._common import sockfam_to_enum
from ._common import socktype_to_enum
from ._common import usage_percent
-from ._common import ZombieProcess
-from ._compat import b
+from ._compat import PY3
from ._compat import FileNotFoundError
from ._compat import PermissionError
from ._compat import ProcessLookupError
-from ._compat import PY3
+from ._compat import b
__extra__all__ = ["CONN_IDLE", "CONN_BOUND", "PROCFS_PATH"]
@@ -155,7 +155,7 @@ def swap_memory():
total = free = 0
for line in lines:
line = line.split()
- t, f = line[3:4]
+ t, f = line[3:5]
total += int(int(t) * 512)
free += int(int(f) * 512)
used = total - free
@@ -190,9 +190,9 @@ def cpu_count_logical():
return None
-def cpu_count_physical():
- """Return the number of physical CPUs in the system."""
- return cext.cpu_count_phys()
+def cpu_count_cores():
+ """Return the number of CPU cores in the system."""
+ return cext.cpu_count_cores()
def cpu_stats():
@@ -231,7 +231,7 @@ def disk_partitions(all=False):
continue
except OSError as err:
# https://github.com/giampaolo/psutil/issues/1674
- debug("skipping %r: %r" % (mountpoint, err))
+ debug("skipping %r: %s" % (mountpoint, err))
continue
maxfile = maxpath = None # set later
ntuple = _common.sdiskpart(device, mountpoint, fstype, opts,
diff --git a/venv/Lib/site-packages/psutil/_psutil_windows.cp39-win_amd64.pyd b/venv/Lib/site-packages/psutil/_psutil_windows.cp39-win_amd64.pyd
index d000c34..3899420 100644
Binary files a/venv/Lib/site-packages/psutil/_psutil_windows.cp39-win_amd64.pyd and b/venv/Lib/site-packages/psutil/_psutil_windows.cp39-win_amd64.pyd differ
diff --git a/venv/Lib/site-packages/psutil/_pswindows.py b/venv/Lib/site-packages/psutil/_pswindows.py
index 98baef5..9966b1b 100644
--- a/venv/Lib/site-packages/psutil/_pswindows.py
+++ b/venv/Lib/site-packages/psutil/_pswindows.py
@@ -14,22 +14,22 @@ import time
from collections import namedtuple
from . import _common
+from ._common import ENCODING
+from ._common import ENCODING_ERRS
from ._common import AccessDenied
+from ._common import NoSuchProcess
+from ._common import TimeoutExpired
from ._common import conn_tmap
from ._common import conn_to_ntuple
from ._common import debug
-from ._common import ENCODING
-from ._common import ENCODING_ERRS
from ._common import isfile_strict
from ._common import memoize
from ._common import memoize_when_activated
-from ._common import NoSuchProcess
from ._common import parse_environ_block
-from ._common import TimeoutExpired
from ._common import usage_percent
+from ._compat import PY3
from ._compat import long
from ._compat import lru_cache
-from ._compat import PY3
from ._compat import range
from ._compat import unicode
from ._psutil_windows import ABOVE_NORMAL_PRIORITY_CLASS
@@ -39,6 +39,7 @@ from ._psutil_windows import IDLE_PRIORITY_CLASS
from ._psutil_windows import NORMAL_PRIORITY_CLASS
from ._psutil_windows import REALTIME_PRIORITY_CLASS
+
try:
from . import _psutil_windows as cext
except ImportError as err:
@@ -197,7 +198,7 @@ def convert_dos_path(s):
"C:\Windows\systemew\file.txt"
"""
rawdrive = '\\'.join(s.split('\\')[:3])
- driveletter = cext.win32_QueryDosDevice(rawdrive)
+ driveletter = cext.QueryDosDevice(rawdrive)
remainder = s[len(rawdrive):]
return os.path.join(driveletter, remainder)
@@ -241,8 +242,16 @@ def virtual_memory():
def swap_memory():
"""Swap system memory as a (total, used, free, sin, sout) tuple."""
mem = cext.virtual_mem()
- total = mem[2]
- free = mem[3]
+
+ total_phys = mem[0]
+ free_phys = mem[1]
+ total_system = mem[2]
+ free_system = mem[3]
+
+ # Despite the name PageFile refers to total system memory here
+ # thus physical memory values need to be substracted to get swap values
+ total = total_system - total_phys
+ free = min(total, free_system - free_phys)
used = total - free
percent = usage_percent(used, total, round_=1)
return _common.sswap(total, used, free, percent, 0, 0)
@@ -304,9 +313,9 @@ def cpu_count_logical():
return cext.cpu_count_logical()
-def cpu_count_physical():
- """Return the number of physical CPU cores in the system."""
- return cext.cpu_count_phys()
+def cpu_count_cores():
+ """Return the number of CPU cores in the system."""
+ return cext.cpu_count_cores()
def cpu_stats():
@@ -759,7 +768,7 @@ class Process(object):
# 24 = ERROR_TOO_MANY_OPEN_FILES. Not sure why this happens
# (perhaps PyPy's JIT delaying garbage collection of files?).
if err.errno == 24:
- debug("%r forced into AccessDenied" % err)
+ debug("%r translated into AccessDenied" % err)
raise AccessDenied(self.pid, self._name)
raise
else:
diff --git a/venv/Lib/site-packages/psutil/tests/__init__.py b/venv/Lib/site-packages/psutil/tests/__init__.py
index e0df67f..21bb3e6 100644
--- a/venv/Lib/site-packages/psutil/tests/__init__.py
+++ b/venv/Lib/site-packages/psutil/tests/__init__.py
@@ -9,6 +9,7 @@ Test utilities.
"""
from __future__ import print_function
+
import atexit
import contextlib
import ctypes
@@ -46,15 +47,16 @@ from psutil import WINDOWS
from psutil._common import bytes2human
from psutil._common import print_color
from psutil._common import supports_ipv6
+from psutil._compat import PY3
from psutil._compat import FileExistsError
from psutil._compat import FileNotFoundError
-from psutil._compat import PY3
from psutil._compat import range
from psutil._compat import super
from psutil._compat import u
from psutil._compat import unicode
from psutil._compat import which
+
if PY3:
import unittest
else:
@@ -72,6 +74,9 @@ if sys.version_info >= (3, 4):
else:
enum = None
+if POSIX:
+ from psutil._psposix import wait_pid
+
__all__ = [
# constants
@@ -482,9 +487,6 @@ def terminate(proc_or_pid, sig=signal.SIGTERM, wait_timeout=GLOBAL_TIMEOUT):
Does nothing if the process does not exist.
Return process exit status.
"""
- if POSIX:
- from psutil._psposix import wait_pid
-
def wait(proc, timeout):
if isinstance(proc, subprocess.Popen) and not PY3:
proc.wait()
@@ -952,6 +954,15 @@ class TestMemoryLeak(PsutilTestCase):
retries = 10 if CI_TESTING else 5
verbose = True
_thisproc = psutil.Process()
+ _psutil_debug_orig = bool(os.getenv('PSUTIL_DEBUG', 0))
+
+ @classmethod
+ def setUpClass(cls):
+ psutil._set_debug(False) # avoid spamming to stderr
+
+ @classmethod
+ def tearDownClass(cls):
+ psutil._set_debug(cls._psutil_debug_orig)
def _get_mem(self):
# USS is the closest thing we have to "real" memory usage and it
@@ -1724,8 +1735,8 @@ else:
in memory via ctypes.
Return the new absolutized, normcased path.
"""
- from ctypes import wintypes
from ctypes import WinError
+ from ctypes import wintypes
ext = ".dll"
dst = get_testfn(suffix=suffix + ext)
libs = [x.path for x in psutil.Process().memory_maps() if
diff --git a/venv/Lib/site-packages/psutil/tests/__main__.py b/venv/Lib/site-packages/psutil/tests/__main__.py
index d5cd02e..e677352 100644
--- a/venv/Lib/site-packages/psutil/tests/__main__.py
+++ b/venv/Lib/site-packages/psutil/tests/__main__.py
@@ -10,4 +10,6 @@ $ python -m psutil.tests
"""
from .runner import main
+
+
main()
diff --git a/venv/Lib/site-packages/psutil/tests/runner.py b/venv/Lib/site-packages/psutil/tests/runner.py
index d761cd2..2e6f83e 100644
--- a/venv/Lib/site-packages/psutil/tests/runner.py
+++ b/venv/Lib/site-packages/psutil/tests/runner.py
@@ -21,6 +21,7 @@ Parallel:
"""
from __future__ import print_function
+
import atexit
import optparse
import os
@@ -28,6 +29,8 @@ import sys
import textwrap
import time
import unittest
+
+
try:
import ctypes
except ImportError:
@@ -298,16 +301,15 @@ def get_runner(parallel=False):
# Used by test_*,py modules.
def run_from_name(name):
+ if CI_TESTING:
+ print_sysinfo()
suite = TestLoader().from_name(name)
runner = get_runner()
runner.run(suite)
def setup():
- # Note: doc states that altering os.environment may cause memory
- # leaks on some platforms.
- # Sets PSUTIL_TESTING and PSUTIL_DEBUG in the C module.
- psutil._psplatform.cext.set_testing()
+ psutil._set_debug(True)
def main():
diff --git a/venv/Lib/site-packages/psutil/tests/test_aix.py b/venv/Lib/site-packages/psutil/tests/test_aix.py
index a32c3f6..6a5debf 100644
--- a/venv/Lib/site-packages/psutil/tests/test_aix.py
+++ b/venv/Lib/site-packages/psutil/tests/test_aix.py
@@ -10,11 +10,11 @@
import re
+import psutil
from psutil import AIX
from psutil.tests import PsutilTestCase
from psutil.tests import sh
from psutil.tests import unittest
-import psutil
@unittest.skipIf(not AIX, "AIX only")
diff --git a/venv/Lib/site-packages/psutil/tests/test_bsd.py b/venv/Lib/site-packages/psutil/tests/test_bsd.py
index b0bff87..54b488b 100644
--- a/venv/Lib/site-packages/psutil/tests/test_bsd.py
+++ b/venv/Lib/site-packages/psutil/tests/test_bsd.py
@@ -20,12 +20,12 @@ from psutil import BSD
from psutil import FREEBSD
from psutil import NETBSD
from psutil import OPENBSD
-from psutil.tests import spawn_testproc
from psutil.tests import HAS_BATTERY
+from psutil.tests import TOLERANCE_SYS_MEM
from psutil.tests import PsutilTestCase
from psutil.tests import retry_on_failure
from psutil.tests import sh
-from psutil.tests import TOLERANCE_SYS_MEM
+from psutil.tests import spawn_testproc
from psutil.tests import terminate
from psutil.tests import unittest
from psutil.tests import which
diff --git a/venv/Lib/site-packages/psutil/tests/test_connections.py b/venv/Lib/site-packages/psutil/tests/test_connections.py
index 6bbf219..5381608 100644
--- a/venv/Lib/site-packages/psutil/tests/test_connections.py
+++ b/venv/Lib/site-packages/psutil/tests/test_connections.py
@@ -8,7 +8,6 @@
import os
import socket
-import sys
import textwrap
from contextlib import closing
from socket import AF_INET
@@ -28,17 +27,17 @@ from psutil import WINDOWS
from psutil._common import supports_ipv6
from psutil._compat import PY3
from psutil.tests import AF_UNIX
+from psutil.tests import HAS_CONNECTIONS_UNIX
+from psutil.tests import SKIP_SYSCONS
+from psutil.tests import PsutilTestCase
from psutil.tests import bind_socket
from psutil.tests import bind_unix_socket
from psutil.tests import check_connection_ntuple
from psutil.tests import create_sockets
-from psutil.tests import HAS_CONNECTIONS_UNIX
-from psutil.tests import PsutilTestCase
from psutil.tests import reap_children
from psutil.tests import retry_on_failure
from psutil.tests import serialrun
from psutil.tests import skip_on_access_denied
-from psutil.tests import SKIP_SYSCONS
from psutil.tests import tcp_socketpair
from psutil.tests import unittest
from psutil.tests import unix_socketpair
@@ -47,7 +46,6 @@ from psutil.tests import wait_for_file
thisproc = psutil.Process()
SOCK_SEQPACKET = getattr(socket, "SOCK_SEQPACKET", object())
-PYTHON_39 = sys.version_info[:2] == (3, 9)
@serialrun
diff --git a/venv/Lib/site-packages/psutil/tests/test_contracts.py b/venv/Lib/site-packages/psutil/tests/test_contracts.py
index 32c75fd..7401cc1 100644
--- a/venv/Lib/site-packages/psutil/tests/test_contracts.py
+++ b/venv/Lib/site-packages/psutil/tests/test_contracts.py
@@ -18,6 +18,7 @@ import sys
import time
import traceback
+import psutil
from psutil import AIX
from psutil import BSD
from psutil import FREEBSD
@@ -33,25 +34,24 @@ from psutil._compat import FileNotFoundError
from psutil._compat import long
from psutil._compat import range
from psutil.tests import APPVEYOR
-from psutil.tests import check_connection_ntuple
from psutil.tests import CI_TESTING
-from psutil.tests import create_sockets
-from psutil.tests import enum
from psutil.tests import GITHUB_ACTIONS
from psutil.tests import HAS_CPU_FREQ
from psutil.tests import HAS_NET_IO_COUNTERS
from psutil.tests import HAS_SENSORS_FANS
from psutil.tests import HAS_SENSORS_TEMPERATURES
+from psutil.tests import PYPY
+from psutil.tests import SKIP_SYSCONS
+from psutil.tests import VALID_PROC_STATUSES
+from psutil.tests import PsutilTestCase
+from psutil.tests import check_connection_ntuple
+from psutil.tests import create_sockets
+from psutil.tests import enum
from psutil.tests import is_namedtuple
from psutil.tests import kernel_version
from psutil.tests import process_namespace
-from psutil.tests import PsutilTestCase
-from psutil.tests import PYPY
from psutil.tests import serialrun
-from psutil.tests import SKIP_SYSCONS
from psutil.tests import unittest
-from psutil.tests import VALID_PROC_STATUSES
-import psutil
# ===================================================================
@@ -360,7 +360,6 @@ def proc_info(pid):
elif isinstance(exc, psutil.NoSuchProcess):
tcase.assertProcessGone(proc)
str(exc)
- assert exc.msg
def do_wait():
if pid != 0:
diff --git a/venv/Lib/site-packages/psutil/tests/test_linux.py b/venv/Lib/site-packages/psutil/tests/test_linux.py
index f8a9e00..20e28d2 100644
--- a/venv/Lib/site-packages/psutil/tests/test_linux.py
+++ b/venv/Lib/site-packages/psutil/tests/test_linux.py
@@ -7,6 +7,7 @@
"""Linux specific tests."""
from __future__ import division
+
import collections
import contextlib
import errno
@@ -23,31 +24,39 @@ import warnings
import psutil
from psutil import LINUX
-from psutil._compat import basestring
-from psutil._compat import FileNotFoundError
from psutil._compat import PY3
+from psutil._compat import FileNotFoundError
+from psutil._compat import basestring
from psutil._compat import u
-from psutil.tests import call_until
+from psutil.tests import GITHUB_ACTIONS
from psutil.tests import GLOBAL_TIMEOUT
from psutil.tests import HAS_BATTERY
from psutil.tests import HAS_CPU_FREQ
from psutil.tests import HAS_GETLOADAVG
from psutil.tests import HAS_RLIMIT
-from psutil.tests import mock
-from psutil.tests import PsutilTestCase
from psutil.tests import PYPY
+from psutil.tests import TOLERANCE_DISK_USAGE
+from psutil.tests import TOLERANCE_SYS_MEM
+from psutil.tests import PsutilTestCase
+from psutil.tests import ThreadTask
+from psutil.tests import call_until
+from psutil.tests import mock
from psutil.tests import reload_module
from psutil.tests import retry_on_failure
from psutil.tests import safe_rmpath
from psutil.tests import sh
from psutil.tests import skip_on_not_implemented
-from psutil.tests import ThreadTask
-from psutil.tests import TOLERANCE_DISK_USAGE
-from psutil.tests import TOLERANCE_SYS_MEM
from psutil.tests import unittest
from psutil.tests import which
+if LINUX:
+ from psutil._pslinux import CLOCK_TICKS
+ from psutil._pslinux import RootFsDeviceFinder
+ from psutil._pslinux import calculate_avail_vmem
+ from psutil._pslinux import open_binary
+
+
HERE = os.path.abspath(os.path.dirname(__file__))
SIOCGIFADDR = 0x8915
SIOCGIFCONF = 0x8912
@@ -58,6 +67,7 @@ if LINUX:
SECTOR_SIZE = 512
EMPTY_TEMPERATURES = not glob.glob('/sys/class/hwmon/hwmon*')
+
# =====================================================================
# --- utils
# =====================================================================
@@ -141,7 +151,7 @@ def free_swap():
"""Parse 'free' cmd and return swap memory's s total, used and free
values.
"""
- out = sh('free -b', env={"LANG": "C.UTF-8"})
+ out = sh(["free", "-b"], env={"LANG": "C.UTF-8"})
lines = out.split('\n')
for line in lines:
if line.startswith('Swap'):
@@ -160,7 +170,7 @@ def free_physmem():
# and 'cached' memory which may have different positions so we
# do not return them.
# https://github.com/giampaolo/psutil/issues/538#issuecomment-57059946
- out = sh('free -b', env={"LANG": "C.UTF-8"})
+ out = sh(["free", "-b"], env={"LANG": "C.UTF-8"})
lines = out.split('\n')
for line in lines:
if line.startswith('Mem'):
@@ -174,7 +184,7 @@ def free_physmem():
def vmstat(stat):
- out = sh("vmstat -s", env={"LANG": "C.UTF-8"})
+ out = sh(["vmstat", "-s"], env={"LANG": "C.UTF-8"})
for line in out.split("\n"):
line = line.strip()
if stat in line:
@@ -183,7 +193,7 @@ def vmstat(stat):
def get_free_version_info():
- out = sh("free -V").strip()
+ out = sh(["free", "-V"]).strip()
if 'UNKNOWN' in out:
raise unittest.SkipTest("can't determine free version")
return tuple(map(int, out.split()[-1].split('.')))
@@ -243,7 +253,8 @@ class TestSystemVirtualMemory(PsutilTestCase):
# self.assertEqual(free_value, psutil_value)
vmstat_value = vmstat('total memory') * 1024
psutil_value = psutil.virtual_memory().total
- self.assertAlmostEqual(vmstat_value, psutil_value)
+ self.assertAlmostEqual(
+ vmstat_value, psutil_value, delta=TOLERANCE_SYS_MEM)
@retry_on_failure()
def test_used(self):
@@ -303,7 +314,7 @@ class TestSystemVirtualMemory(PsutilTestCase):
def test_available(self):
# "free" output format has changed at some point:
# https://github.com/giampaolo/psutil/issues/538#issuecomment-147192098
- out = sh("free -b")
+ out = sh(["free", "-b"])
lines = out.split('\n')
if 'available' not in lines[0]:
raise unittest.SkipTest("free does not support 'available' column")
@@ -357,9 +368,6 @@ class TestSystemVirtualMemory(PsutilTestCase):
def test_avail_old_percent(self):
# Make sure that our calculation of avail mem for old kernels
# is off by max 15%.
- from psutil._pslinux import calculate_avail_vmem
- from psutil._pslinux import open_binary
-
mems = {}
with open_binary('/proc/meminfo') as f:
for line in f:
@@ -715,7 +723,7 @@ class TestSystemCPUCountLogical(PsutilTestCase):
@unittest.skipIf(not LINUX, "LINUX only")
-class TestSystemCPUCountPhysical(PsutilTestCase):
+class TestSystemCPUCountCores(PsutilTestCase):
@unittest.skipIf(not which("lscpu"), "lscpu utility not available")
def test_against_lscpu(self):
@@ -728,9 +736,9 @@ class TestSystemCPUCountPhysical(PsutilTestCase):
self.assertEqual(psutil.cpu_count(logical=False), len(core_ids))
def test_method_2(self):
- meth_1 = psutil._pslinux.cpu_count_physical()
+ meth_1 = psutil._pslinux.cpu_count_cores()
with mock.patch('glob.glob', return_value=[]) as m:
- meth_2 = psutil._pslinux.cpu_count_physical()
+ meth_2 = psutil._pslinux.cpu_count_cores()
assert m.called
if meth_1 is not None:
self.assertEqual(meth_1, meth_2)
@@ -738,7 +746,7 @@ class TestSystemCPUCountPhysical(PsutilTestCase):
def test_emulate_none(self):
with mock.patch('glob.glob', return_value=[]) as m1:
with mock.patch('psutil._common.open', create=True) as m2:
- self.assertIsNone(psutil._pslinux.cpu_count_physical())
+ self.assertIsNone(psutil._pslinux.cpu_count_cores())
assert m1.called
assert m2.called
@@ -768,18 +776,14 @@ class TestSystemCPUFrequency(PsutilTestCase):
if path.startswith('/sys/devices/system/cpu/'):
return False
else:
- if path == "/proc/cpuinfo":
- flags.append(None)
return os_path_exists(path)
- flags = []
os_path_exists = os.path.exists
try:
with mock.patch("os.path.exists", side_effect=path_exists_mock):
reload_module(psutil._pslinux)
ret = psutil.cpu_freq()
assert ret
- assert flags
self.assertEqual(ret.max, 0.0)
self.assertEqual(ret.min, 0.0)
for freq in psutil.cpu_freq(percpu=True):
@@ -1263,6 +1267,68 @@ class TestSystemDiskIoCounters(PsutilTestCase):
self.assertRaises(NotImplementedError, psutil.disk_io_counters)
+@unittest.skipIf(not LINUX, "LINUX only")
+class TestRootFsDeviceFinder(PsutilTestCase):
+
+ def setUp(self):
+ dev = os.stat("/").st_dev
+ self.major = os.major(dev)
+ self.minor = os.minor(dev)
+
+ def test_call_methods(self):
+ finder = RootFsDeviceFinder()
+ if os.path.exists("/proc/partitions"):
+ finder.ask_proc_partitions()
+ else:
+ self.assertRaises(FileNotFoundError, finder.ask_proc_partitions)
+ if os.path.exists("/sys/dev/block/%s:%s/uevent" % (
+ self.major, self.minor)):
+ finder.ask_sys_dev_block()
+ else:
+ self.assertRaises(FileNotFoundError, finder.ask_sys_dev_block)
+ finder.ask_sys_class_block()
+
+ @unittest.skipIf(GITHUB_ACTIONS, "unsupported on GITHUB_ACTIONS")
+ def test_comparisons(self):
+ finder = RootFsDeviceFinder()
+ self.assertIsNotNone(finder.find())
+
+ a = b = c = None
+ if os.path.exists("/proc/partitions"):
+ a = finder.ask_proc_partitions()
+ if os.path.exists("/sys/dev/block/%s:%s/uevent" % (
+ self.major, self.minor)):
+ b = finder.ask_sys_class_block()
+ c = finder.ask_sys_dev_block()
+
+ base = a or b or c
+ if base and a:
+ self.assertEqual(base, a)
+ if base and b:
+ self.assertEqual(base, b)
+ if base and c:
+ self.assertEqual(base, c)
+
+ @unittest.skipIf(not which("findmnt"), "findmnt utility not available")
+ @unittest.skipIf(GITHUB_ACTIONS, "unsupported on GITHUB_ACTIONS")
+ def test_against_findmnt(self):
+ psutil_value = RootFsDeviceFinder().find()
+ findmnt_value = sh("findmnt -o SOURCE -rn /")
+ self.assertEqual(psutil_value, findmnt_value)
+
+ def test_disk_partitions_mocked(self):
+ with mock.patch(
+ 'psutil._pslinux.cext.disk_partitions',
+ return_value=[('/dev/root', '/', 'ext4', 'rw')]) as m:
+ part = psutil.disk_partitions()[0]
+ assert m.called
+ if not GITHUB_ACTIONS:
+ self.assertNotEqual(part.device, "/dev/root")
+ self.assertEqual(part.device, RootFsDeviceFinder().find())
+ else:
+ self.assertEqual(part.device, "/dev/root")
+
+
# =====================================================================
# --- misc
# =====================================================================
@@ -1431,9 +1497,7 @@ class TestMisc(PsutilTestCase):
# - Process(tid) is supposed to work
# - pids() should not return the TID
# See: https://github.com/giampaolo/psutil/issues/687
- t = ThreadTask()
- t.start()
- try:
+ with ThreadTask():
p = psutil.Process()
threads = p.threads()
self.assertEqual(len(threads), 2)
@@ -1442,8 +1506,6 @@ class TestMisc(PsutilTestCase):
pt = psutil.Process(tid)
pt.as_dict()
self.assertNotIn(tid, psutil.pids())
- finally:
- t.stop()
def test_pid_exists_no_proc_status(self):
# Internally pid_exists relies on /proc/{pid}/status.
@@ -1837,6 +1899,22 @@ class TestProcess(PsutilTestCase):
assert not files
assert m.called
+ def test_open_files_enametoolong(self):
+ # Simulate a case where /proc/{pid}/fd/{fd} symlink
+ # points to a file with full path longer than PATH_MAX, see:
+ # https://github.com/giampaolo/psutil/issues/1940
+ p = psutil.Process()
+ files = p.open_files()
+ with open(self.get_testfn(), 'w'):
+ # give the kernel some time to see the new file
+ call_until(p.open_files, "len(ret) != %i" % len(files))
+ patch_point = 'psutil._pslinux.os.readlink'
+ with mock.patch(patch_point,
+ side_effect=OSError(errno.ENAMETOOLONG, "")) as m:
+ files = p.open_files()
+ assert not files
+ assert m.called
+
# --- mocked tests
def test_terminal_mocked(self):
@@ -1985,8 +2063,6 @@ class TestProcess(PsutilTestCase):
self.assertEqual(exc.exception.name, p.name())
def test_stat_file_parsing(self):
- from psutil._pslinux import CLOCK_TICKS
-
args = [
"0", # pid
"(cat)", # name
@@ -2072,6 +2148,16 @@ class TestProcess(PsutilTestCase):
self.assertEqual(gids.saved, 1006)
self.assertEqual(p._proc._get_eligible_cpus(), list(range(0, 8)))
+ def test_connections_enametoolong(self):
+ # Simulate a case where /proc/{pid}/fd/{fd} symlink points to
+ # a file with full path longer than PATH_MAX, see:
+ # https://github.com/giampaolo/psutil/issues/1940
+ with mock.patch('psutil._pslinux.os.readlink',
+ side_effect=OSError(errno.ENAMETOOLONG, "")) as m:
+ p = psutil.Process()
+ assert not p.connections()
+ assert m.called
+
@unittest.skipIf(not LINUX, "LINUX only")
class TestProcessAgainstStatus(PsutilTestCase):
diff --git a/venv/Lib/site-packages/psutil/tests/test_memleaks.py b/venv/Lib/site-packages/psutil/tests/test_memleaks.py
index ab6aac6..d5baffa 100644
--- a/venv/Lib/site-packages/psutil/tests/test_memleaks.py
+++ b/venv/Lib/site-packages/psutil/tests/test_memleaks.py
@@ -16,6 +16,7 @@ because of how its JIT handles memory, so tests are skipped.
"""
from __future__ import print_function
+
import functools
import os
@@ -29,8 +30,6 @@ from psutil import SUNOS
from psutil import WINDOWS
from psutil._compat import ProcessLookupError
from psutil._compat import super
-from psutil.tests import create_sockets
-from psutil.tests import get_testfn
from psutil.tests import HAS_CPU_AFFINITY
from psutil.tests import HAS_CPU_FREQ
from psutil.tests import HAS_ENVIRON
@@ -43,12 +42,14 @@ from psutil.tests import HAS_RLIMIT
from psutil.tests import HAS_SENSORS_BATTERY
from psutil.tests import HAS_SENSORS_FANS
from psutil.tests import HAS_SENSORS_TEMPERATURES
+from psutil.tests import TestMemoryLeak
+from psutil.tests import create_sockets
+from psutil.tests import get_testfn
from psutil.tests import process_namespace
from psutil.tests import skip_on_access_denied
from psutil.tests import spawn_testproc
from psutil.tests import system_namespace
from psutil.tests import terminate
-from psutil.tests import TestMemoryLeak
from psutil.tests import unittest
@@ -347,7 +348,7 @@ class TestModuleFunctionsLeaks(TestMemoryLeak):
self.execute(lambda: psutil.cpu_count(logical=True))
@fewtimes_if_linux()
- def test_cpu_count_physical(self):
+ def test_cpu_count_cores(self):
self.execute(lambda: psutil.cpu_count(logical=False))
@fewtimes_if_linux()
@@ -456,6 +457,9 @@ class TestModuleFunctionsLeaks(TestMemoryLeak):
def test_users(self):
self.execute(psutil.users)
+ def test_set_debug(self):
+ self.execute(lambda: psutil._set_debug(False))
+
if WINDOWS:
# --- win services
diff --git a/venv/Lib/site-packages/psutil/tests/test_misc.py b/venv/Lib/site-packages/psutil/tests/test_misc.py
index 81fa8f3..d946eb6 100644
--- a/venv/Lib/site-packages/psutil/tests/test_misc.py
+++ b/venv/Lib/site-packages/psutil/tests/test_misc.py
@@ -17,16 +17,19 @@ import os
import pickle
import socket
import stat
-import sys
+import psutil
+import psutil.tests
from psutil import LINUX
from psutil import POSIX
from psutil import WINDOWS
+from psutil._common import debug
from psutil._common import memoize
from psutil._common import memoize_when_activated
from psutil._common import supports_ipv6
from psutil._common import wrap_numbers
from psutil._compat import PY3
+from psutil._compat import redirect_stderr
from psutil.tests import APPVEYOR
from psutil.tests import CI_TESTING
from psutil.tests import HAS_BATTERY
@@ -35,20 +38,15 @@ from psutil.tests import HAS_NET_IO_COUNTERS
from psutil.tests import HAS_SENSORS_BATTERY
from psutil.tests import HAS_SENSORS_FANS
from psutil.tests import HAS_SENSORS_TEMPERATURES
-from psutil.tests import import_module_by_path
-from psutil.tests import mock
-from psutil.tests import PsutilTestCase
from psutil.tests import PYTHON_EXE
-from psutil.tests import reload_module
from psutil.tests import ROOT_DIR
from psutil.tests import SCRIPTS_DIR
+from psutil.tests import PsutilTestCase
+from psutil.tests import import_module_by_path
+from psutil.tests import mock
+from psutil.tests import reload_module
from psutil.tests import sh
from psutil.tests import unittest
-import psutil
-import psutil.tests
-
-
-PYTHON_39 = sys.version_info[:2] == (3, 9)
# ===================================================================
@@ -97,57 +95,71 @@ class TestMisc(PsutilTestCase):
def test_process__str__(self):
self.test_process__repr__(func=str)
- def test_no_such_process__repr__(self, func=repr):
+ def test_no_such_process__repr__(self):
self.assertEqual(
repr(psutil.NoSuchProcess(321)),
- "psutil.NoSuchProcess process no longer exists (pid=321)")
+ "psutil.NoSuchProcess(pid=321, msg='process no longer exists')")
self.assertEqual(
- repr(psutil.NoSuchProcess(321, name='foo')),
- "psutil.NoSuchProcess process no longer exists (pid=321, "
- "name='foo')")
- self.assertEqual(
- repr(psutil.NoSuchProcess(321, msg='foo')),
- "psutil.NoSuchProcess foo")
+ repr(psutil.NoSuchProcess(321, name="name", msg="msg")),
+ "psutil.NoSuchProcess(pid=321, name='name', msg='msg')")
- def test_zombie_process__repr__(self, func=repr):
+ def test_no_such_process__str__(self):
+ self.assertEqual(
+ str(psutil.NoSuchProcess(321)),
+ "process no longer exists (pid=321)")
+ self.assertEqual(
+ str(psutil.NoSuchProcess(321, name="name", msg="msg")),
+ "msg (pid=321, name='name')")
+
+ def test_zombie_process__repr__(self):
self.assertEqual(
repr(psutil.ZombieProcess(321)),
- "psutil.ZombieProcess process still exists but it's a zombie "
- "(pid=321)")
+ 'psutil.ZombieProcess(pid=321, msg="PID still '
+ 'exists but it\'s a zombie")')
self.assertEqual(
- repr(psutil.ZombieProcess(321, name='foo')),
- "psutil.ZombieProcess process still exists but it's a zombie "
- "(pid=321, name='foo')")
- self.assertEqual(
- repr(psutil.ZombieProcess(321, name='foo', ppid=1)),
- "psutil.ZombieProcess process still exists but it's a zombie "
- "(pid=321, name='foo', ppid=1)")
- self.assertEqual(
- repr(psutil.ZombieProcess(321, msg='foo')),
- "psutil.ZombieProcess foo")
+ repr(psutil.ZombieProcess(321, name="name", ppid=320, msg="foo")),
+ "psutil.ZombieProcess(pid=321, ppid=320, name='name', msg='foo')")
- def test_access_denied__repr__(self, func=repr):
+ def test_zombie_process__str__(self):
+ self.assertEqual(
+ str(psutil.ZombieProcess(321)),
+ "PID still exists but it's a zombie (pid=321)")
+ self.assertEqual(
+ str(psutil.ZombieProcess(321, name="name", ppid=320, msg="foo")),
+ "foo (pid=321, ppid=320, name='name')")
+
+ def test_access_denied__repr__(self):
self.assertEqual(
repr(psutil.AccessDenied(321)),
- "psutil.AccessDenied (pid=321)")
+ "psutil.AccessDenied(pid=321)")
self.assertEqual(
- repr(psutil.AccessDenied(321, name='foo')),
- "psutil.AccessDenied (pid=321, name='foo')")
- self.assertEqual(
- repr(psutil.AccessDenied(321, msg='foo')),
- "psutil.AccessDenied foo")
+ repr(psutil.AccessDenied(321, name="name", msg="msg")),
+ "psutil.AccessDenied(pid=321, name='name', msg='msg')")
- def test_timeout_expired__repr__(self, func=repr):
+ def test_access_denied__str__(self):
self.assertEqual(
- repr(psutil.TimeoutExpired(321)),
- "psutil.TimeoutExpired timeout after 321 seconds")
+ str(psutil.AccessDenied(321)),
+ "(pid=321)")
self.assertEqual(
- repr(psutil.TimeoutExpired(321, pid=111)),
- "psutil.TimeoutExpired timeout after 321 seconds (pid=111)")
+ str(psutil.AccessDenied(321, name="name", msg="msg")),
+ "msg (pid=321, name='name')")
+
+ def test_timeout_expired__repr__(self):
self.assertEqual(
- repr(psutil.TimeoutExpired(321, pid=111, name='foo')),
- "psutil.TimeoutExpired timeout after 321 seconds "
- "(pid=111, name='foo')")
+ repr(psutil.TimeoutExpired(5)),
+ "psutil.TimeoutExpired(seconds=5, msg='timeout after 5 seconds')")
+ self.assertEqual(
+ repr(psutil.TimeoutExpired(5, pid=321, name="name")),
+ "psutil.TimeoutExpired(pid=321, name='name', seconds=5, "
+ "msg='timeout after 5 seconds')")
+
+ def test_timeout_expired__str__(self):
+ self.assertEqual(
+ str(psutil.TimeoutExpired(5)),
+ "timeout after 5 seconds")
+ self.assertEqual(
+ str(psutil.TimeoutExpired(5, pid=321, name="name")),
+ "timeout after 5 seconds (pid=321, name='name')")
def test_process__eq__(self):
p1 = psutil.Process()
@@ -354,6 +366,8 @@ class TestMisc(PsutilTestCase):
check(psutil.disk_usage(os.getcwd()))
check(psutil.users())
+ # XXX: https://github.com/pypa/setuptools/pull/2896
+ @unittest.skipIf(APPVEYOR, "temporarily disabled due to setuptools bug")
def test_setup_script(self):
setup_py = os.path.join(ROOT_DIR, 'setup.py')
if CI_TESTING and not os.path.exists(setup_py):
@@ -387,6 +401,35 @@ class TestMisc(PsutilTestCase):
reload_module(psutil)
self.assertIn("version conflict", str(cm.exception).lower())
+ def test_debug(self):
+ if PY3:
+ from io import StringIO
+ else:
+ from StringIO import StringIO
+
+ with redirect_stderr(StringIO()) as f:
+ debug("hello")
+ msg = f.getvalue()
+ assert msg.startswith("psutil-debug"), msg
+ self.assertIn("hello", msg)
+ self.assertIn(__file__.replace('.pyc', '.py'), msg)
+
+ # supposed to use repr(exc)
+ with redirect_stderr(StringIO()) as f:
+ debug(ValueError("this is an error"))
+ msg = f.getvalue()
+ self.assertIn("ignoring ValueError", msg)
+ self.assertIn("'this is an error'", msg)
+
+ # supposed to use str(exc), because of extra info about file name
+ with redirect_stderr(StringIO()) as f:
+ exc = OSError(2, "no such file")
+ exc.filename = "/foo"
+ debug(exc)
+ msg = f.getvalue()
+ self.assertIn("no such file", msg)
+ self.assertIn("/foo", msg)
+
# ===================================================================
# --- Tests for wrap_numbers() function.
@@ -679,11 +722,12 @@ class TestScripts(PsutilTestCase):
@unittest.skipIf(not POSIX, "POSIX only")
def test_executable(self):
- for name in os.listdir(SCRIPTS_DIR):
- if name.endswith('.py'):
- path = os.path.join(SCRIPTS_DIR, name)
- if not stat.S_IXUSR & os.stat(path)[stat.ST_MODE]:
- self.fail('%r is not executable' % path)
+ for root, dirs, files in os.walk(SCRIPTS_DIR):
+ for file in files:
+ if file.endswith('.py'):
+ path = os.path.join(root, file)
+ if not stat.S_IXUSR & os.stat(path)[stat.ST_MODE]:
+ raise self.fail('%r is not executable' % path)
def test_disk_usage(self):
self.assert_stdout('disk_usage.py')
diff --git a/venv/Lib/site-packages/psutil/tests/test_osx.py b/venv/Lib/site-packages/psutil/tests/test_osx.py
index 348976f..4f4b1c2 100644
--- a/venv/Lib/site-packages/psutil/tests/test_osx.py
+++ b/venv/Lib/site-packages/psutil/tests/test_osx.py
@@ -11,17 +11,22 @@ import time
import psutil
from psutil import MACOS
+from psutil import POSIX
from psutil.tests import HAS_BATTERY
+from psutil.tests import TOLERANCE_DISK_USAGE
+from psutil.tests import TOLERANCE_SYS_MEM
from psutil.tests import PsutilTestCase
from psutil.tests import retry_on_failure
from psutil.tests import sh
from psutil.tests import spawn_testproc
from psutil.tests import terminate
-from psutil.tests import TOLERANCE_DISK_USAGE
-from psutil.tests import TOLERANCE_SYS_MEM
from psutil.tests import unittest
+if POSIX:
+ from psutil._psutil_posix import getpagesize
+
+
def sysctl(cmdline):
"""Expects a sysctl command with an argument and parse the result
returning only the value of interest.
@@ -36,8 +41,6 @@ def sysctl(cmdline):
def vm_stat(field):
"""Wrapper around 'vm_stat' cmdline utility."""
- from psutil._psutil_posix import getpagesize
-
out = sh('vm_stat')
for line in out.split('\n'):
if field in line:
@@ -137,7 +140,7 @@ class TestSystemAPIs(PsutilTestCase):
num = sysctl("sysctl hw.logicalcpu")
self.assertEqual(num, psutil.cpu_count(logical=True))
- def test_cpu_count_physical(self):
+ def test_cpu_count_cores(self):
num = sysctl("sysctl hw.physicalcpu")
self.assertEqual(num, psutil.cpu_count(logical=False))
diff --git a/venv/Lib/site-packages/psutil/tests/test_posix.py b/venv/Lib/site-packages/psutil/tests/test_posix.py
index acb6aa2..31b8192 100644
--- a/venv/Lib/site-packages/psutil/tests/test_posix.py
+++ b/venv/Lib/site-packages/psutil/tests/test_posix.py
@@ -23,18 +23,19 @@ from psutil import OPENBSD
from psutil import POSIX
from psutil import SUNOS
from psutil.tests import CI_TESTING
-from psutil.tests import spawn_testproc
from psutil.tests import HAS_NET_IO_COUNTERS
-from psutil.tests import mock
-from psutil.tests import PsutilTestCase
from psutil.tests import PYTHON_EXE
+from psutil.tests import PsutilTestCase
+from psutil.tests import mock
from psutil.tests import retry_on_failure
from psutil.tests import sh
from psutil.tests import skip_on_access_denied
+from psutil.tests import spawn_testproc
from psutil.tests import terminate
from psutil.tests import unittest
from psutil.tests import which
+
if POSIX:
import mmap
import resource
diff --git a/venv/Lib/site-packages/psutil/tests/test_process.py b/venv/Lib/site-packages/psutil/tests/test_process.py
index 0ec2ead..c9059e3 100644
--- a/venv/Lib/site-packages/psutil/tests/test_process.py
+++ b/venv/Lib/site-packages/psutil/tests/test_process.py
@@ -21,7 +21,6 @@ import time
import types
import psutil
-
from psutil import AIX
from psutil import BSD
from psutil import LINUX
@@ -33,15 +32,12 @@ from psutil import POSIX
from psutil import SUNOS
from psutil import WINDOWS
from psutil._common import open_text
+from psutil._compat import PY3
from psutil._compat import FileNotFoundError
from psutil._compat import long
-from psutil._compat import PY3
from psutil._compat import super
from psutil.tests import APPVEYOR
-from psutil.tests import call_until
from psutil.tests import CI_TESTING
-from psutil.tests import copyload_shared_lib
-from psutil.tests import create_exe
from psutil.tests import GITHUB_ACTIONS
from psutil.tests import GLOBAL_TIMEOUT
from psutil.tests import HAS_CPU_AFFINITY
@@ -52,17 +48,20 @@ from psutil.tests import HAS_PROC_CPU_NUM
from psutil.tests import HAS_PROC_IO_COUNTERS
from psutil.tests import HAS_RLIMIT
from psutil.tests import HAS_THREADS
-from psutil.tests import mock
-from psutil.tests import process_namespace
-from psutil.tests import PsutilTestCase
from psutil.tests import PYPY
from psutil.tests import PYTHON_EXE
+from psutil.tests import PsutilTestCase
+from psutil.tests import ThreadTask
+from psutil.tests import call_until
+from psutil.tests import copyload_shared_lib
+from psutil.tests import create_exe
+from psutil.tests import mock
+from psutil.tests import process_namespace
from psutil.tests import reap_children
from psutil.tests import retry_on_failure
from psutil.tests import sh
from psutil.tests import skip_on_access_denied
from psutil.tests import skip_on_not_implemented
-from psutil.tests import ThreadTask
from psutil.tests import unittest
from psutil.tests import wait_for_pid
@@ -718,6 +717,12 @@ class TestProcess(PsutilTestCase):
if NETBSD or OPENBSD or AIX:
self.assertEqual(p.cmdline()[0], PYTHON_EXE)
else:
+ if MACOS and CI_TESTING:
+ pyexe = p.cmdline()[0]
+ if pyexe != PYTHON_EXE:
+ self.assertEqual(' '.join(p.cmdline()[1:]),
+ ' '.join(cmdline[1:]))
+ return
self.assertEqual(' '.join(p.cmdline()), ' '.join(cmdline))
@unittest.skipIf(PYPY, "broken on PYPY")
@@ -1326,6 +1331,20 @@ class TestProcess(PsutilTestCase):
self.assertEqual(p.status(), psutil.STATUS_ZOMBIE)
assert m.called
+ def test_reused_pid(self):
+ # Emulate a case where PID has been reused by another process.
+ subp = self.spawn_testproc()
+ p = psutil.Process(subp.pid)
+ p._ident = (p.pid, p.create_time() + 100)
+ assert not p.is_running()
+ assert p != psutil.Process(subp.pid)
+ msg = "process no longer exists and its PID has been reused"
+ self.assertRaisesRegex(psutil.NoSuchProcess, msg, p.suspend)
+ self.assertRaisesRegex(psutil.NoSuchProcess, msg, p.resume)
+ self.assertRaisesRegex(psutil.NoSuchProcess, msg, p.terminate)
+ self.assertRaisesRegex(psutil.NoSuchProcess, msg, p.kill)
+ self.assertRaisesRegex(psutil.NoSuchProcess, msg, p.children)
+
def test_pid_0(self):
# Process(0) is supposed to work on all platforms except Linux
if 0 not in psutil.pids():
@@ -1369,7 +1388,6 @@ class TestProcess(PsutilTestCase):
def test_environ(self):
def clean_dict(d):
# Most of these are problematic on Travis.
- d.pop("PSUTIL_TESTING", None)
d.pop("PLAT", None)
d.pop("HOME", None)
if MACOS:
@@ -1395,11 +1413,13 @@ class TestProcess(PsutilTestCase):
code = textwrap.dedent("""
#include
#include
+
char * const argv[] = {"cat", 0};
char * const envp[] = {"A=1", "X", "C=3", 0};
+
int main(void) {
- /* Close stderr on exec so parent can wait for the execve to
- * finish. */
+ // Close stderr on exec so parent can wait for the
+ // execve to finish.
if (fcntl(2, F_SETFD, FD_CLOEXEC) != 0)
return 0;
return execve("/bin/cat", argv, envp);
diff --git a/venv/Lib/site-packages/psutil/tests/test_system.py b/venv/Lib/site-packages/psutil/tests/test_system.py
index 90ecff9..db2cb34 100644
--- a/venv/Lib/site-packages/psutil/tests/test_system.py
+++ b/venv/Lib/site-packages/psutil/tests/test_system.py
@@ -31,10 +31,9 @@ from psutil import WINDOWS
from psutil._compat import FileNotFoundError
from psutil._compat import long
from psutil.tests import ASCII_FS
-from psutil.tests import check_net_address
from psutil.tests import CI_TESTING
from psutil.tests import DEVNULL
-from psutil.tests import enum
+from psutil.tests import GITHUB_ACTIONS
from psutil.tests import GLOBAL_TIMEOUT
from psutil.tests import HAS_BATTERY
from psutil.tests import HAS_CPU_FREQ
@@ -44,12 +43,13 @@ from psutil.tests import HAS_SENSORS_BATTERY
from psutil.tests import HAS_SENSORS_FANS
from psutil.tests import HAS_SENSORS_TEMPERATURES
from psutil.tests import IS_64BIT
-from psutil.tests import mock
-from psutil.tests import PsutilTestCase
from psutil.tests import PYPY
-from psutil.tests import retry_on_failure
-from psutil.tests import GITHUB_ACTIONS
from psutil.tests import UNICODE_SUFFIX
+from psutil.tests import PsutilTestCase
+from psutil.tests import check_net_address
+from psutil.tests import enum
+from psutil.tests import mock
+from psutil.tests import retry_on_failure
from psutil.tests import unittest
@@ -316,16 +316,16 @@ class TestCpuAPIs(PsutilTestCase):
if "physical id" not in cpuinfo_data:
raise unittest.SkipTest("cpuinfo doesn't include physical id")
- def test_cpu_count_physical(self):
+ def test_cpu_count_cores(self):
logical = psutil.cpu_count()
- physical = psutil.cpu_count(logical=False)
- if physical is None:
- raise self.skipTest("physical cpu_count() is None")
+ cores = psutil.cpu_count(logical=False)
+ if cores is None:
+ raise self.skipTest("cpu_count_cores() is None")
if WINDOWS and sys.getwindowsversion()[:2] <= (6, 1): # <= Vista
- self.assertIsNone(physical)
+ self.assertIsNone(cores)
else:
- self.assertGreaterEqual(physical, 1)
- self.assertGreaterEqual(logical, physical)
+ self.assertGreaterEqual(cores, 1)
+ self.assertGreaterEqual(logical, cores)
def test_cpu_count_none(self):
# https://github.com/giampaolo/psutil/issues/1085
@@ -334,7 +334,7 @@ class TestCpuAPIs(PsutilTestCase):
return_value=val) as m:
self.assertIsNone(psutil.cpu_count())
assert m.called
- with mock.patch('psutil._psplatform.cpu_count_physical',
+ with mock.patch('psutil._psplatform.cpu_count_cores',
return_value=val) as m:
self.assertIsNone(psutil.cpu_count(logical=False))
assert m.called
diff --git a/venv/Lib/site-packages/psutil/tests/test_testutils.py b/venv/Lib/site-packages/psutil/tests/test_testutils.py
index 31ac4de..89888df 100644
--- a/venv/Lib/site-packages/psutil/tests/test_testutils.py
+++ b/venv/Lib/site-packages/psutil/tests/test_testutils.py
@@ -17,25 +17,28 @@ import socket
import stat
import subprocess
+import psutil
+import psutil.tests
from psutil import FREEBSD
from psutil import NETBSD
from psutil import POSIX
from psutil._common import open_binary
from psutil._common import open_text
from psutil._common import supports_ipv6
+from psutil.tests import CI_TESTING
+from psutil.tests import HAS_CONNECTIONS_UNIX
+from psutil.tests import PYTHON_EXE
+from psutil.tests import PsutilTestCase
+from psutil.tests import TestMemoryLeak
from psutil.tests import bind_socket
from psutil.tests import bind_unix_socket
from psutil.tests import call_until
from psutil.tests import chdir
-from psutil.tests import CI_TESTING
from psutil.tests import create_sockets
from psutil.tests import get_free_port
-from psutil.tests import HAS_CONNECTIONS_UNIX
from psutil.tests import is_namedtuple
from psutil.tests import mock
from psutil.tests import process_namespace
-from psutil.tests import PsutilTestCase
-from psutil.tests import PYTHON_EXE
from psutil.tests import reap_children
from psutil.tests import retry
from psutil.tests import retry_on_failure
@@ -45,13 +48,11 @@ from psutil.tests import serialrun
from psutil.tests import system_namespace
from psutil.tests import tcp_socketpair
from psutil.tests import terminate
-from psutil.tests import TestMemoryLeak
from psutil.tests import unittest
from psutil.tests import unix_socketpair
from psutil.tests import wait_for_file
from psutil.tests import wait_for_pid
-import psutil
-import psutil.tests
+
# ===================================================================
# --- Unit tests for test utilities.
@@ -350,6 +351,7 @@ class TestNetUtils(PsutilTestCase):
@serialrun
class TestMemLeakClass(TestMemoryLeak):
+ @retry_on_failure()
def test_times(self):
def fun():
cnt['cnt'] += 1
diff --git a/venv/Lib/site-packages/psutil/tests/test_unicode.py b/venv/Lib/site-packages/psutil/tests/test_unicode.py
index 9edb8c8..e635726 100644
--- a/venv/Lib/site-packages/psutil/tests/test_unicode.py
+++ b/venv/Lib/site-packages/psutil/tests/test_unicode.py
@@ -79,6 +79,7 @@ import traceback
import warnings
from contextlib import closing
+import psutil
from psutil import BSD
from psutil import OPENBSD
from psutil import POSIX
@@ -87,28 +88,27 @@ from psutil._compat import PY3
from psutil._compat import u
from psutil.tests import APPVEYOR
from psutil.tests import ASCII_FS
-from psutil.tests import bind_unix_socket
-from psutil.tests import chdir
from psutil.tests import CI_TESTING
-from psutil.tests import copyload_shared_lib
-from psutil.tests import create_exe
-from psutil.tests import get_testfn
from psutil.tests import HAS_CONNECTIONS_UNIX
from psutil.tests import HAS_ENVIRON
from psutil.tests import HAS_MEMORY_MAPS
from psutil.tests import INVALID_UNICODE_SUFFIX
-from psutil.tests import PsutilTestCase
from psutil.tests import PYPY
+from psutil.tests import TESTFN_PREFIX
+from psutil.tests import UNICODE_SUFFIX
+from psutil.tests import PsutilTestCase
+from psutil.tests import bind_unix_socket
+from psutil.tests import chdir
+from psutil.tests import copyload_shared_lib
+from psutil.tests import create_exe
+from psutil.tests import get_testfn
from psutil.tests import safe_mkdir
from psutil.tests import safe_rmpath
from psutil.tests import serialrun
from psutil.tests import skip_on_access_denied
from psutil.tests import spawn_testproc
from psutil.tests import terminate
-from psutil.tests import TESTFN_PREFIX
-from psutil.tests import UNICODE_SUFFIX
from psutil.tests import unittest
-import psutil
if APPVEYOR:
diff --git a/venv/Lib/site-packages/psutil/tests/test_windows.py b/venv/Lib/site-packages/psutil/tests/test_windows.py
index a9254e2..ea694be 100644
--- a/venv/Lib/site-packages/psutil/tests/test_windows.py
+++ b/venv/Lib/site-packages/psutil/tests/test_windows.py
@@ -27,15 +27,15 @@ from psutil.tests import APPVEYOR
from psutil.tests import GITHUB_ACTIONS
from psutil.tests import HAS_BATTERY
from psutil.tests import IS_64BIT
-from psutil.tests import mock
-from psutil.tests import PsutilTestCase
from psutil.tests import PY3
from psutil.tests import PYPY
+from psutil.tests import TOLERANCE_DISK_USAGE
+from psutil.tests import PsutilTestCase
+from psutil.tests import mock
from psutil.tests import retry_on_failure
from psutil.tests import sh
from psutil.tests import spawn_testproc
from psutil.tests import terminate
-from psutil.tests import TOLERANCE_DISK_USAGE
from psutil.tests import unittest
@@ -47,24 +47,13 @@ if WINDOWS and not PYPY:
import win32process
import wmi # requires "pip install wmi" / "make setup-dev-env"
+if WINDOWS:
+ from psutil._pswindows import convert_oserror
+
cext = psutil._psplatform.cext
-def wrap_exceptions(fun):
- def wrapper(self, *args, **kwargs):
- try:
- return fun(self, *args, **kwargs)
- except OSError as err:
- from psutil._pswindows import ACCESS_DENIED_SET
- if err.errno in ACCESS_DENIED_SET:
- raise psutil.AccessDenied(None, None)
- if err.errno == errno.ESRCH:
- raise psutil.NoSuchProcess(None, None)
- raise
- return wrapper
-
-
@unittest.skipIf(not WINDOWS, "WINDOWS only")
@unittest.skipIf(PYPY, "pywin32 not available on PYPY")
# https://github.com/giampaolo/psutil/pull/1762#issuecomment-632892692
@@ -100,7 +89,7 @@ class TestCpuAPIs(WindowsTestCase):
proc = w.Win32_Processor()[0]
self.assertEqual(psutil.cpu_count(), proc.NumberOfLogicalProcessors)
- def test_cpu_count_phys_vs_wmi(self):
+ def test_cpu_count_cores_vs_wmi(self):
w = wmi.WMI()
proc = w.Win32_Processor()[0]
self.assertEqual(psutil.cpu_count(logical=False), proc.NumberOfCores)
@@ -633,7 +622,6 @@ class TestDualProcessImplementation(PsutilTestCase):
assert fun.called
def test_cmdline(self):
- from psutil._pswindows import convert_oserror
for pid in psutil.pids():
try:
a = cext.proc_cmdline(pid, use_peb=True)
@@ -725,7 +713,7 @@ class RemoteProcessTestCase(PsutilTestCase):
p = psutil.Process(self.proc32.pid)
e = p.environ()
self.assertIn("THINK_OF_A_NUMBER", e)
- self.assertEquals(e["THINK_OF_A_NUMBER"], str(os.getpid()))
+ self.assertEqual(e["THINK_OF_A_NUMBER"], str(os.getpid()))
def test_environ_64(self):
p = psutil.Process(self.proc64.pid)
diff --git a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/INSTALLER b/venv/Lib/site-packages/setuptools-60.0.3.dist-info/INSTALLER
deleted file mode 100644
index a1b589e..0000000
--- a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/INSTALLER
+++ /dev/null
@@ -1 +0,0 @@
-pip
diff --git a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/LICENSE b/venv/Lib/site-packages/setuptools-60.0.3.dist-info/LICENSE
deleted file mode 100644
index 353924b..0000000
--- a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright Jason R. Coombs
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/METADATA b/venv/Lib/site-packages/setuptools-60.0.3.dist-info/METADATA
deleted file mode 100644
index cb61d90..0000000
--- a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/METADATA
+++ /dev/null
@@ -1,124 +0,0 @@
-Metadata-Version: 2.1
-Name: setuptools
-Version: 60.0.3
-Summary: Easily download, build, install, upgrade, and uninstall Python packages
-Home-page: https://github.com/pypa/setuptools
-Author: Python Packaging Authority
-Author-email: distutils-sig@python.org
-License: UNKNOWN
-Project-URL: Documentation, https://setuptools.pypa.io/
-Keywords: CPAN PyPI distutils eggs package management
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: System :: Archiving :: Packaging
-Classifier: Topic :: System :: Systems Administration
-Classifier: Topic :: Utilities
-Requires-Python: >=3.7
-License-File: LICENSE
-Provides-Extra: certs
-Provides-Extra: docs
-Requires-Dist: sphinx ; extra == 'docs'
-Requires-Dist: jaraco.packaging (>=8.2) ; extra == 'docs'
-Requires-Dist: rst.linker (>=1.9) ; extra == 'docs'
-Requires-Dist: jaraco.tidelift (>=1.4) ; extra == 'docs'
-Requires-Dist: pygments-github-lexers (==0.0.5) ; extra == 'docs'
-Requires-Dist: sphinx-inline-tabs ; extra == 'docs'
-Requires-Dist: sphinxcontrib-towncrier ; extra == 'docs'
-Requires-Dist: furo ; extra == 'docs'
-Provides-Extra: ssl
-Provides-Extra: testing
-Requires-Dist: pytest (>=6) ; extra == 'testing'
-Requires-Dist: pytest-checkdocs (>=2.4) ; extra == 'testing'
-Requires-Dist: pytest-flake8 ; extra == 'testing'
-Requires-Dist: pytest-cov ; extra == 'testing'
-Requires-Dist: pytest-enabler (>=1.0.1) ; extra == 'testing'
-Requires-Dist: mock ; extra == 'testing'
-Requires-Dist: flake8-2020 ; extra == 'testing'
-Requires-Dist: virtualenv (>=13.0.0) ; extra == 'testing'
-Requires-Dist: pytest-virtualenv (>=1.2.7) ; extra == 'testing'
-Requires-Dist: wheel ; extra == 'testing'
-Requires-Dist: paver ; extra == 'testing'
-Requires-Dist: pip (>=19.1) ; extra == 'testing'
-Requires-Dist: jaraco.envs (>=2.2) ; extra == 'testing'
-Requires-Dist: pytest-xdist ; extra == 'testing'
-Requires-Dist: sphinx ; extra == 'testing'
-Requires-Dist: jaraco.path (>=3.2.0) ; extra == 'testing'
-Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing'
-Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy") and extra == 'testing'
-
-.. image:: https://raw.githubusercontent.com/pypa/setuptools/main/docs/images/banner-640x320.svg
- :align: center
-
-|
-
-.. image:: https://img.shields.io/pypi/v/setuptools.svg
- :target: `PyPI link`_
-
-.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg
- :target: `PyPI link`_
-
-.. _PyPI link: https://pypi.org/project/setuptools
-
-.. image:: https://github.com/pypa/setuptools/workflows/tests/badge.svg
- :target: https://github.com/pypa/setuptools/actions?query=workflow%3A%22tests%22
- :alt: tests
-
-.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
- :target: https://github.com/psf/black
- :alt: Code style: Black
-
-.. image:: https://img.shields.io/readthedocs/setuptools/latest.svg
- :target: https://setuptools.pypa.io
-
-.. image:: https://img.shields.io/badge/skeleton-2021-informational
- :target: https://blog.jaraco.com/skeleton
-
-.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white
- :target: https://codecov.io/gh/pypa/setuptools
-
-.. image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat
- :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme
-
-See the `Installation Instructions
-`_ in the Python Packaging
-User's Guide for instructions on installing, upgrading, and uninstalling
-Setuptools.
-
-Questions and comments should be directed to the `distutils-sig
-mailing list `_.
-Bug reports and especially tested patches may be
-submitted directly to the `bug tracker
-`_.
-
-
-Code of Conduct
-===============
-
-Everyone interacting in the setuptools project's codebases, issue trackers,
-chat rooms, and mailing lists is expected to follow the
-`PSF Code of Conduct `_.
-
-
-For Enterprise
-==============
-
-Available as part of the Tidelift Subscription.
-
-Setuptools and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.
-
-`Learn more `_.
-
-
-Security Contact
-================
-
-To report a security vulnerability, please use the
-`Tidelift security contact `_.
-Tidelift will coordinate the fix and disclosure.
-
-
diff --git a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/RECORD b/venv/Lib/site-packages/setuptools-60.0.3.dist-info/RECORD
deleted file mode 100644
index 539c3e5..0000000
--- a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/RECORD
+++ /dev/null
@@ -1,297 +0,0 @@
-_distutils_hack/__init__.py,sha256=8AFtsXYDw0MMp6RE4osVd0Rdnaf38y90btaCDDRCoH0,4014
-_distutils_hack/__pycache__/__init__.cpython-39.pyc,,
-_distutils_hack/__pycache__/override.cpython-39.pyc,,
-_distutils_hack/override.py,sha256=Eu_s-NF6VIZ4Cqd0tbbA5wtWky2IZPNd8et6GLt1mzo,44
-distutils-precedence.pth,sha256=JjjOniUA5XKl4N5_rtZmHrVp0baW_LoHsN0iPaX10iQ,151
-pkg_resources/__init__.py,sha256=uAnPq8FsTXHAEHFWK7UU9AhdNjE4o5Skfk8CyfbztO8,108573
-pkg_resources/__pycache__/__init__.cpython-39.pyc,,
-pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pkg_resources/_vendor/__pycache__/__init__.cpython-39.pyc,,
-pkg_resources/_vendor/__pycache__/appdirs.cpython-39.pyc,,
-pkg_resources/_vendor/__pycache__/pyparsing.cpython-39.pyc,,
-pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701
-pkg_resources/_vendor/packaging/__about__.py,sha256=IIRHpOsJlJSgkjq1UoeBoMTqhvNp3gN9FyMb5Kf8El4,661
-pkg_resources/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497
-pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/markers.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/tags.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/utils.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/__pycache__/version.cpython-39.pyc,,
-pkg_resources/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488
-pkg_resources/_vendor/packaging/_musllinux.py,sha256=z5yeG1ygOPx4uUyLdqj-p8Dk5UBb5H_b0NIjW9yo8oA,4378
-pkg_resources/_vendor/packaging/_structures.py,sha256=TMiAgFbdUOPmIfDIfiHc3KFhSJ8kMjof2QS5I-2NyQ8,1629
-pkg_resources/_vendor/packaging/markers.py,sha256=gFSKoBTb0sKDw1v_apJy15lPr0v2mEvuEkfooTtcWx4,8496
-pkg_resources/_vendor/packaging/requirements.py,sha256=uJ4cjwm3_nrfHJLCcGU9mT5aw8SXfw8v1aBUD7OFuVs,4706
-pkg_resources/_vendor/packaging/specifiers.py,sha256=MZ-fYcNL3u7pNrt-6g2EQO7AbRXkjc-SPEYwXMQbLmc,30964
-pkg_resources/_vendor/packaging/tags.py,sha256=vGybAUQYlPKMcukzX_2e65fmafnFFuMbD25naYTEwtc,15710
-pkg_resources/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
-pkg_resources/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
-pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055
-pkg_resources/extern/__init__.py,sha256=3PixaT9Tzzd4NoyV6CVhGd7S_9Z-U5yvMWAftZKvC6k,2362
-pkg_resources/extern/__pycache__/__init__.cpython-39.pyc,,
-pkg_resources/tests/data/my-test-package-source/__pycache__/setup.cpython-39.pyc,,
-pkg_resources/tests/data/my-test-package-source/setup.py,sha256=Mrezl3nqxkYkjCYpIxmjhhg4AR8hgi4QZdEYmk-I7R8,104
-setuptools-60.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-setuptools-60.0.3.dist-info/LICENSE,sha256=2z8CRrH5J48VhFuZ_sR4uLUG63ZIeZNyL4xuJUKF-vg,1050
-setuptools-60.0.3.dist-info/METADATA,sha256=mGuu7DhncmGsqzGoOzN0s1FZ7ydotAT7_hVg2x2veRQ,4963
-setuptools-60.0.3.dist-info/RECORD,,
-setuptools-60.0.3.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
-setuptools-60.0.3.dist-info/entry_points.txt,sha256=wpnhLrbtyk4hZ1qCCw48cCSxoQPzULMhIuaFqsB7GxQ,2636
-setuptools-60.0.3.dist-info/top_level.txt,sha256=d9yL39v_W7qmKDDSH6sT4bE0j_Ls1M3P161OGgdsm4g,41
-setuptools/__init__.py,sha256=l7ULo8jGk-4-8jbacmJ58cYpSRX4swS1ccbJaJVAGdM,7448
-setuptools/__pycache__/__init__.cpython-39.pyc,,
-setuptools/__pycache__/_deprecation_warning.cpython-39.pyc,,
-setuptools/__pycache__/_imp.cpython-39.pyc,,
-setuptools/__pycache__/archive_util.cpython-39.pyc,,
-setuptools/__pycache__/build_meta.cpython-39.pyc,,
-setuptools/__pycache__/config.cpython-39.pyc,,
-setuptools/__pycache__/dep_util.cpython-39.pyc,,
-setuptools/__pycache__/depends.cpython-39.pyc,,
-setuptools/__pycache__/dist.cpython-39.pyc,,
-setuptools/__pycache__/errors.cpython-39.pyc,,
-setuptools/__pycache__/extension.cpython-39.pyc,,
-setuptools/__pycache__/glob.cpython-39.pyc,,
-setuptools/__pycache__/installer.cpython-39.pyc,,
-setuptools/__pycache__/launch.cpython-39.pyc,,
-setuptools/__pycache__/monkey.cpython-39.pyc,,
-setuptools/__pycache__/msvc.cpython-39.pyc,,
-setuptools/__pycache__/namespaces.cpython-39.pyc,,
-setuptools/__pycache__/package_index.cpython-39.pyc,,
-setuptools/__pycache__/py34compat.cpython-39.pyc,,
-setuptools/__pycache__/sandbox.cpython-39.pyc,,
-setuptools/__pycache__/unicode_utils.cpython-39.pyc,,
-setuptools/__pycache__/version.cpython-39.pyc,,
-setuptools/__pycache__/wheel.cpython-39.pyc,,
-setuptools/__pycache__/windows_support.cpython-39.pyc,,
-setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218
-setuptools/_distutils/__init__.py,sha256=3YtkfadGoU57VMEQFk2TNyMZVud1kDkakWQLhWg2Fm8,536
-setuptools/_distutils/__pycache__/__init__.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/_msvccompiler.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/archive_util.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/bcppcompiler.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/ccompiler.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/cmd.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/config.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/core.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/cygwinccompiler.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/debug.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/dep_util.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/dir_util.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/dist.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/errors.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/extension.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/fancy_getopt.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/file_util.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/filelist.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/log.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/msvc9compiler.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/msvccompiler.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/py35compat.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/py38compat.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/spawn.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/sysconfig.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/text_file.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/unixccompiler.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/util.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/version.cpython-39.pyc,,
-setuptools/_distutils/__pycache__/versionpredicate.cpython-39.pyc,,
-setuptools/_distutils/_msvccompiler.py,sha256=jR0JM5A1JMnZ6xMDicQzhXWgXTVXs1lWAeUexC1z198,20813
-setuptools/_distutils/archive_util.py,sha256=qW-uiGwYexTvK5e-iSel_31Dshx-CqTanNPK6snwf98,8572
-setuptools/_distutils/bcppcompiler.py,sha256=OJDVpCUmX6H8v_7lV1zifV1fcx92Cr2dhiUh6989UJI,14894
-setuptools/_distutils/ccompiler.py,sha256=YbernlpGZZqKnfzZSfJ814fINca8cicZiUlBjyUPyaM,47644
-setuptools/_distutils/cmd.py,sha256=eco6LAGUtobLuPafuhmgKgkwRRL_WY8KJ4YeDCHpcls,18079
-setuptools/_distutils/command/__init__.py,sha256=2TA-rlNDlzeI-csbWHXFjGD8uOYqALMfyWOhT49nC6g,799
-setuptools/_distutils/command/__pycache__/__init__.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/bdist.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/bdist_msi.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/build.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/build_clib.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/build_ext.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/build_py.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/build_scripts.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/check.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/clean.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/config.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/install.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/install_data.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/install_egg_info.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/install_headers.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/install_lib.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/install_scripts.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/py37compat.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/register.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/sdist.cpython-39.pyc,,
-setuptools/_distutils/command/__pycache__/upload.cpython-39.pyc,,
-setuptools/_distutils/command/bdist.py,sha256=2z4eudRl_n7m3lG9leL0IYqes4bsm8c0fxfZuiafjMg,5562
-setuptools/_distutils/command/bdist_dumb.py,sha256=BTur9jcIppyP7Piavjfsk7YjElqvxeYO2npUyPPOekc,4913
-setuptools/_distutils/command/bdist_msi.py,sha256=EVFQYN_X-ExeeP8gmdV9JcINsuUGsLJUz9afMU0Rt8c,35579
-setuptools/_distutils/command/bdist_rpm.py,sha256=gjOw22GhDSbcq0bdq25cTb-n6HWWm0bShLQad_mkJ4k,21537
-setuptools/_distutils/command/bdist_wininst.py,sha256=iGlaI-VfElHOneeczKHWnSN5a10-7IMcJaXuR1mdS3c,16030
-setuptools/_distutils/command/build.py,sha256=1AF-dxN_NlOEyoydBz19AwpeWYPSYCZvOLJSN_PdatY,5773
-setuptools/_distutils/command/build_clib.py,sha256=bgVTHh28eLQA2Gkw68amApd_j7qQBX4MTI-zTvAK_J4,8022
-setuptools/_distutils/command/build_ext.py,sha256=KgxpopuD6sqep0LsumMH15joWih0VdbnXpYm-ETNjoE,31612
-setuptools/_distutils/command/build_py.py,sha256=hXesMrH_epNj6K8SUtJdipgEis3EdICKeZ8VWe_ndck,16495
-setuptools/_distutils/command/build_scripts.py,sha256=urdn6wPxPMW5dLqpqFkZ8dqaFG1tf9TiAao6U9LCoEI,5963
-setuptools/_distutils/command/check.py,sha256=5qDtI75ccZg3sAItQWeaIu8y3FR314O4rr9Smz4HsEo,5637
-setuptools/_distutils/command/clean.py,sha256=2TCt47ru4hZZM0RfVfUYj5bbpicpGLP4Qhw5jBtvp9k,2776
-setuptools/_distutils/command/config.py,sha256=2aTjww3PwjMB8-ZibCe4P7B-qG1hM1gn_rJXYyxRz6c,13117
-setuptools/_distutils/command/install.py,sha256=wpaYPr38D55ZL9JCLqHKuTIUdhwX9K3LyQ_4T2E2n8w,29704
-setuptools/_distutils/command/install_data.py,sha256=YhGOAwh3gJPqF7em5XA0rmpR42z1bLh80ooElzDyUvk,2822
-setuptools/_distutils/command/install_egg_info.py,sha256=WijZ7cHMAkNMMCwrZ--KoqV9M2RtLouU4-qSbiCwv70,2753
-setuptools/_distutils/command/install_headers.py,sha256=XQ6idkbIDfr1ljXCOznuVUMvOFpHBn6cK0Wz9gIM2b4,1298
-setuptools/_distutils/command/install_lib.py,sha256=9AofR-MO9lAtjwwuukCptepOaJEKMZW2VHiyR5hU7HA,8397
-setuptools/_distutils/command/install_scripts.py,sha256=_CLUeQwGJRcY2kik7azPMn5IdtDCrjWdUvZ1khlG6ck,2017
-setuptools/_distutils/command/py37compat.py,sha256=qzRhhvTihqx_PZZt2ZYECxh1X3Oj255VqatzelYFAKw,671
-setuptools/_distutils/command/register.py,sha256=2jaq9968rt2puRVDBx1HbNiXv27uOk8idE_4lPf_3VM,11712
-setuptools/_distutils/command/sdist.py,sha256=qotJjAOzyhJjq2-oDImjNFrOtaSneEFDJTB-sEk1wnU,19005
-setuptools/_distutils/command/upload.py,sha256=BLO1w7eSAqsCjCLXtf_CRVSjwF1WmyOByGVGNdcQ8oY,7597
-setuptools/_distutils/config.py,sha256=dtHgblx9JhfyrKx1-J7Jlxw_f7s8ZbPFQii2UWMTZpY,4827
-setuptools/_distutils/core.py,sha256=0v7Emh9y0AW9o4AEjfVMhDxKzTFWFxUQn46spFSL56g,9282
-setuptools/_distutils/cygwinccompiler.py,sha256=oZh-mbF-3ClAsZBplFrxt4ck9iXXNIK3ipFNNfdnGIk,17357
-setuptools/_distutils/debug.py,sha256=N6MrTAqK6l9SVk6tWweR108PM8Ol7qNlfyV-nHcLhsY,139
-setuptools/_distutils/dep_util.py,sha256=GuR9Iw_jzZRkyemJ5HX8rB_wRGxkIBcBm1qh54r7zhk,3491
-setuptools/_distutils/dir_util.py,sha256=UwhBOUTcV65GTwce4SPuTXR8Z8q3LYEcmttqcGb0bYo,7778
-setuptools/_distutils/dist.py,sha256=Biuf6ca8uiFfMScRFsYUKtb5neMPtxKxRtXn50_1f3U,50421
-setuptools/_distutils/errors.py,sha256=Yr6tKZGdzBoNi53vBtiq0UJ__X05CmxSdQJqOWaw6SY,3577
-setuptools/_distutils/extension.py,sha256=bTb3Q0CoevGKYv5dX1ls--Ln8tlB0-UEOsi9BwzlZ-s,10515
-setuptools/_distutils/fancy_getopt.py,sha256=OPxp2CxHi1Yp_d1D8JxW4Ueq9fC71tegQFaafh58GGU,17784
-setuptools/_distutils/file_util.py,sha256=0hUqfItN_x2DVihR0MHdA4KCMVCOO8VoByaFp_a6MDg,8148
-setuptools/_distutils/filelist.py,sha256=Z9f5hvepZnpniZ2IFmCnWIjdviWozs8sbARBhWajwoM,13407
-setuptools/_distutils/log.py,sha256=hWBmdUC2K927QcVv3REMW3HMPclxccPQngxLSuUXQl0,1969
-setuptools/_distutils/msvc9compiler.py,sha256=23cxMWGk2i8iFEvr5xdAXThlGM4LDuhQcM0175psc7A,30483
-setuptools/_distutils/msvccompiler.py,sha256=qruALeGRq8-CjtjE2tLQ8W26QnchcYedWzFme8AxZ4Q,23540
-setuptools/_distutils/py35compat.py,sha256=-sk1vBIsOgH-AobjIYbK_OEjdJF_54Ul_D1EiE9XM_c,455
-setuptools/_distutils/py38compat.py,sha256=II7ddBxOijC7uNN4z_46HYUjwYTJYMNiLJoGTormZm0,212
-setuptools/_distutils/spawn.py,sha256=4uE9k3VZWijxy7E_Rlcmh1MoamaPJ8rajdNBagKxjgU,3498
-setuptools/_distutils/sysconfig.py,sha256=k3fzINx3-qjge0udI6fC1UQSDPYpMGrxeSuV9cY4rmU,22151
-setuptools/_distutils/text_file.py,sha256=PsuAJeWdKJoLSV_6N6IpB5-0Pa84KzLUucJMFRazw3I,12483
-setuptools/_distutils/unixccompiler.py,sha256=u2Sfs6LRmqQux4nZW08GwDtoFMded6wYnkiaO2TvKC4,14538
-setuptools/_distutils/util.py,sha256=0v7B6nIsAXP11A7xqS6FC6lFAdaIqzxz_C-at4aMcgs,20655
-setuptools/_distutils/version.py,sha256=syRvPxuMQxnftpuIKeRE-2ELQ_ZMCwMJ-o8ie-lxdZo,13015
-setuptools/_distutils/versionpredicate.py,sha256=vx4ND3BtMgxFR9iZ4_t3WFa-NdIKxO8vtOd0twBppxc,5277
-setuptools/_imp.py,sha256=HmF91IbitRfsD5z-g4_wmcuH-RahyIONbPgiCOFgtzA,2392
-setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-setuptools/_vendor/__pycache__/__init__.cpython-39.pyc,,
-setuptools/_vendor/__pycache__/ordered_set.cpython-39.pyc,,
-setuptools/_vendor/__pycache__/pyparsing.cpython-39.pyc,,
-setuptools/_vendor/more_itertools/__init__.py,sha256=C7sXffHTXM3P-iaLPPfqfmDoxOflQMJLcM7ed9p3jak,82
-setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-39.pyc,,
-setuptools/_vendor/more_itertools/__pycache__/more.cpython-39.pyc,,
-setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-39.pyc,,
-setuptools/_vendor/more_itertools/more.py,sha256=DlZa8v6JihVwfQ5zHidOA-xDE0orcQIUyxVnCaUoDKE,117968
-setuptools/_vendor/more_itertools/recipes.py,sha256=UkNkrsZyqiwgLHANBTmvMhCvaNSvSNYhyOpz_Jc55DY,16256
-setuptools/_vendor/ordered_set.py,sha256=dbaCcs27dyN9gnMWGF5nA_BrVn6Q-NrjKYJpV9_fgBs,15130
-setuptools/_vendor/packaging/__about__.py,sha256=IIRHpOsJlJSgkjq1UoeBoMTqhvNp3gN9FyMb5Kf8El4,661
-setuptools/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497
-setuptools/_vendor/packaging/__pycache__/__about__.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/__init__.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/_structures.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/markers.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/requirements.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/tags.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/utils.cpython-39.pyc,,
-setuptools/_vendor/packaging/__pycache__/version.cpython-39.pyc,,
-setuptools/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488
-setuptools/_vendor/packaging/_musllinux.py,sha256=z5yeG1ygOPx4uUyLdqj-p8Dk5UBb5H_b0NIjW9yo8oA,4378
-setuptools/_vendor/packaging/_structures.py,sha256=TMiAgFbdUOPmIfDIfiHc3KFhSJ8kMjof2QS5I-2NyQ8,1629
-setuptools/_vendor/packaging/markers.py,sha256=lihRgqpZjLM-JW-vxlLPqU3kmVe79g9vypy1kxmTRuQ,8493
-setuptools/_vendor/packaging/requirements.py,sha256=Opd0FjqgdEiWkzBLyo1oLU0Dj01uIFwTAnAJQrr6j2A,4700
-setuptools/_vendor/packaging/specifiers.py,sha256=MZ-fYcNL3u7pNrt-6g2EQO7AbRXkjc-SPEYwXMQbLmc,30964
-setuptools/_vendor/packaging/tags.py,sha256=vGybAUQYlPKMcukzX_2e65fmafnFFuMbD25naYTEwtc,15710
-setuptools/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
-setuptools/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
-setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055
-setuptools/archive_util.py,sha256=maJDbozRbDeSPw53VT0cb_IS3W0Ap73lJR8tX8RZDx0,7077
-setuptools/build_meta.py,sha256=hCU742vjgXHY6oKPYttBkie-n4DVNAJrUOgn0O_V3nc,10536
-setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
-setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752
-setuptools/cli-arm64.exe,sha256=o9amxowudZ98NvNWh_a2DRY8LhoIRqTAekxABqltiMc,137216
-setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
-setuptools/command/__init__.py,sha256=e-8TJOikUe3St0fw2b2p9u5EDdSxl5zHUBJJKifbcQ8,217
-setuptools/command/__pycache__/__init__.cpython-39.pyc,,
-setuptools/command/__pycache__/alias.cpython-39.pyc,,
-setuptools/command/__pycache__/bdist_egg.cpython-39.pyc,,
-setuptools/command/__pycache__/bdist_rpm.cpython-39.pyc,,
-setuptools/command/__pycache__/build_clib.cpython-39.pyc,,
-setuptools/command/__pycache__/build_ext.cpython-39.pyc,,
-setuptools/command/__pycache__/build_py.cpython-39.pyc,,
-setuptools/command/__pycache__/develop.cpython-39.pyc,,
-setuptools/command/__pycache__/dist_info.cpython-39.pyc,,
-setuptools/command/__pycache__/easy_install.cpython-39.pyc,,
-setuptools/command/__pycache__/egg_info.cpython-39.pyc,,
-setuptools/command/__pycache__/install.cpython-39.pyc,,
-setuptools/command/__pycache__/install_egg_info.cpython-39.pyc,,
-setuptools/command/__pycache__/install_lib.cpython-39.pyc,,
-setuptools/command/__pycache__/install_scripts.cpython-39.pyc,,
-setuptools/command/__pycache__/py36compat.cpython-39.pyc,,
-setuptools/command/__pycache__/register.cpython-39.pyc,,
-setuptools/command/__pycache__/rotate.cpython-39.pyc,,
-setuptools/command/__pycache__/saveopts.cpython-39.pyc,,
-setuptools/command/__pycache__/sdist.cpython-39.pyc,,
-setuptools/command/__pycache__/setopt.cpython-39.pyc,,
-setuptools/command/__pycache__/test.cpython-39.pyc,,
-setuptools/command/__pycache__/upload.cpython-39.pyc,,
-setuptools/command/__pycache__/upload_docs.cpython-39.pyc,,
-setuptools/command/alias.py,sha256=1sLQxZcNh6dDQpDmm4G7UGGTol83nY1NTPmNBbm2siI,2381
-setuptools/command/bdist_egg.py,sha256=-upiB6fFtm8cQSQj1LRDVpG1-T143DsXCvV0fh03u7U,16604
-setuptools/command/bdist_rpm.py,sha256=PxrgoHPNaw2Pw2qNjjHDPC-Ay_IaDbCqP3d_5N-cj2A,1182
-setuptools/command/build_clib.py,sha256=fWHSFGkk10VCddBWCszvNhowbG9Z9CZXVjQ2uSInoOs,4415
-setuptools/command/build_ext.py,sha256=SNK042HfB2ezlDQbSVRGFqI1IM5A4AsjU1wpV3fgskE,13212
-setuptools/command/build_py.py,sha256=c90V1nVPEtYkdye-xvo-B48V5RLvSgD8JBMfPtUbtYw,8751
-setuptools/command/develop.py,sha256=5_Ss7ENd1_B_jVMY1tF5UV_y1Xu6jbVzAPG8oKeluGA,7012
-setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960
-setuptools/command/easy_install.py,sha256=gapK3GqeIhiT1DEXX46orMxWC6bJRa8lxp9usbBD1Ts,85791
-setuptools/command/egg_info.py,sha256=0Y3BXOaQ5tftvCet6LA4lD4A_K9igTKfl-wUJmvs84A,26126
-setuptools/command/install.py,sha256=UynjFBgRyyHrDZRVAmXrXG0vChJAMx-sxnOO3JoAzVo,4906
-setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203
-setuptools/command/install_lib.py,sha256=Uz42McsyHZAjrB6cw9E7Bz0xsaTbzxnM1PI9CBhiPtE,3875
-setuptools/command/install_scripts.py,sha256=o0jN_ex7yYYk8W5clymTFOXwkFMKzW9q_zd9Npcex7M,2593
-setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628
-setuptools/command/py36compat.py,sha256=7yLWzQj179Enx3pJ8V1cDDCzeLMFMd9XJXlK-iZTq5Y,4946
-setuptools/command/register.py,sha256=kk3DxXCb5lXTvqnhfwx2g6q7iwbUmgTyXUCaBooBOUk,468
-setuptools/command/rotate.py,sha256=SvsQPasezIojPjvMnfkqzh8P0U0tCj0daczF8uc3NQM,2128
-setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658
-setuptools/command/sdist.py,sha256=2onJidYBPFpUgcX6J4KjZX5ilwciHPRB8VkID5YVaL0,6413
-setuptools/command/setopt.py,sha256=okxhqD1NM1nQlbSVDCNv6P7Y7g680sc2r-tUW7wPH1Y,5086
-setuptools/command/test.py,sha256=qGY-Hx1RPCndlVh2rsrEs5479CgmxRsrEflVLr98jVA,8088
-setuptools/command/upload.py,sha256=XT3YFVfYPAmA5qhGg0euluU98ftxRUW-PzKcODMLxUs,462
-setuptools/command/upload_docs.py,sha256=ba5kOyedD_u62weinrxqqnvpuQvBIuamXehJG6tAvO0,7218
-setuptools/config.py,sha256=O-T_28163qkEeaX8bLgqJLuOLYur15cC2_xpA0RENfM,23153
-setuptools/dep_util.py,sha256=BDx1BkzNQntvAB4alypHbW5UVBzjqths000PrUL4Zqc,949
-setuptools/depends.py,sha256=QYQIadr5DwLxPzkErhNt5hmRhvGhWxoXZMRXCm_jcQ0,5499
-setuptools/dist.py,sha256=y3gQZbodbqOTG_cXFXuQ2OnTwciIlpZpIciapxOIfBc,43154
-setuptools/errors.py,sha256=t4Rm85eXm71Ti0-PO1gAQMRK3V7NN3x1tcbcw0-xGSI,1555
-setuptools/extension.py,sha256=NMM46XjNdVelWemc0x8CyVKA5Ks6Zm3xTWSA2SS6xZM,1684
-setuptools/extern/__init__.py,sha256=Hhf9W73WAitw9TdRJfDIb6YFjmK56CF61afds1Mg0HY,2407
-setuptools/extern/__pycache__/__init__.cpython-39.pyc,,
-setuptools/glob.py,sha256=1oZjbfjAHSXbgdhSuR6YGU8jKob9L8NtEmBYqcPTLYk,4873
-setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
-setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264
-setuptools/gui-arm64.exe,sha256=TEFnOKDi-mq3ZszxqbCoCXTnM_lhUWjdIqBpr6fVs40,137728
-setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
-setuptools/installer.py,sha256=s6DQfsoICBJxbUqbduhOJtl1oG0S4yegRCg3EAs0i3M,3824
-setuptools/launch.py,sha256=TyPT-Ic1T2EnYvGO26gfNRP4ysBlrhpbRjQxWsiO414,812
-setuptools/monkey.py,sha256=0e3HdVKXHL415O7np-AUqhEFXPPuDdJKbI47chQ_DE4,5217
-setuptools/msvc.py,sha256=3LLt938e6OR7wWPzIvCQu7LCWZSIKqoKV6w3r8jV3kY,50561
-setuptools/namespaces.py,sha256=PMqGVPXPYQgjUTvEg9bGccRAkIODrQ6NmsDg_fwErwI,3093
-setuptools/package_index.py,sha256=SV0gUvX5-uEsnjDJYCS5IRiWs-zEqN5H_vYJcuaq7-A,40092
-setuptools/py34compat.py,sha256=KYOd6ybRxjBW8NJmYD8t_UyyVmysppFXqHpFLdslGXU,245
-setuptools/sandbox.py,sha256=mR83i-mu-ZUU_7TaMgYCeRSyzkqv8loJ_GR9xhS2DDw,14348
-setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218
-setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138
-setuptools/unicode_utils.py,sha256=aOOFo4JGwAsiBttGYDsqFS7YqWQeZ2j6DWiCuctR_00,941
-setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144
-setuptools/wheel.py,sha256=0P8tSk105uF_Ub-30N2HU2X2v7MKDSdjpeQlRRW3SkI,8288
-setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714
diff --git a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/WHEEL b/venv/Lib/site-packages/setuptools-60.0.3.dist-info/WHEEL
deleted file mode 100644
index 5bad85f..0000000
--- a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/WHEEL
+++ /dev/null
@@ -1,5 +0,0 @@
-Wheel-Version: 1.0
-Generator: bdist_wheel (0.37.0)
-Root-Is-Purelib: true
-Tag: py3-none-any
-
diff --git a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/entry_points.txt b/venv/Lib/site-packages/setuptools-60.0.3.dist-info/entry_points.txt
deleted file mode 100644
index 9466bf6..0000000
--- a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/entry_points.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-[distutils.commands]
-alias = setuptools.command.alias:alias
-bdist_egg = setuptools.command.bdist_egg:bdist_egg
-bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm
-build_clib = setuptools.command.build_clib:build_clib
-build_ext = setuptools.command.build_ext:build_ext
-build_py = setuptools.command.build_py:build_py
-develop = setuptools.command.develop:develop
-dist_info = setuptools.command.dist_info:dist_info
-easy_install = setuptools.command.easy_install:easy_install
-egg_info = setuptools.command.egg_info:egg_info
-install = setuptools.command.install:install
-install_egg_info = setuptools.command.install_egg_info:install_egg_info
-install_lib = setuptools.command.install_lib:install_lib
-install_scripts = setuptools.command.install_scripts:install_scripts
-rotate = setuptools.command.rotate:rotate
-saveopts = setuptools.command.saveopts:saveopts
-sdist = setuptools.command.sdist:sdist
-setopt = setuptools.command.setopt:setopt
-test = setuptools.command.test:test
-upload_docs = setuptools.command.upload_docs:upload_docs
-
-[distutils.setup_keywords]
-dependency_links = setuptools.dist:assert_string_list
-eager_resources = setuptools.dist:assert_string_list
-entry_points = setuptools.dist:check_entry_points
-exclude_package_data = setuptools.dist:check_package_data
-extras_require = setuptools.dist:check_extras
-include_package_data = setuptools.dist:assert_bool
-install_requires = setuptools.dist:check_requirements
-namespace_packages = setuptools.dist:check_nsp
-package_data = setuptools.dist:check_package_data
-packages = setuptools.dist:check_packages
-python_requires = setuptools.dist:check_specifier
-setup_requires = setuptools.dist:check_requirements
-test_loader = setuptools.dist:check_importable
-test_runner = setuptools.dist:check_importable
-test_suite = setuptools.dist:check_test_suite
-tests_require = setuptools.dist:check_requirements
-use_2to3 = setuptools.dist:invalid_unless_false
-zip_safe = setuptools.dist:assert_bool
-
-[egg_info.writers]
-PKG-INFO = setuptools.command.egg_info:write_pkg_info
-dependency_links.txt = setuptools.command.egg_info:overwrite_arg
-depends.txt = setuptools.command.egg_info:warn_depends_obsolete
-eager_resources.txt = setuptools.command.egg_info:overwrite_arg
-entry_points.txt = setuptools.command.egg_info:write_entries
-namespace_packages.txt = setuptools.command.egg_info:overwrite_arg
-requires.txt = setuptools.command.egg_info:write_requirements
-top_level.txt = setuptools.command.egg_info:write_toplevel_names
-
-[setuptools.finalize_distribution_options]
-keywords = setuptools.dist:Distribution._finalize_setup_keywords
-parent_finalize = setuptools.dist:_Distribution.finalize_options
-
diff --git a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/top_level.txt b/venv/Lib/site-packages/setuptools-60.0.3.dist-info/top_level.txt
deleted file mode 100644
index b5ac107..0000000
--- a/venv/Lib/site-packages/setuptools-60.0.3.dist-info/top_level.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-_distutils_hack
-pkg_resources
-setuptools
diff --git a/venv/Lib/site-packages/setuptools/__init__.py b/venv/Lib/site-packages/setuptools/__init__.py
index 9d6f0bc..43d1c96 100644
--- a/venv/Lib/site-packages/setuptools/__init__.py
+++ b/venv/Lib/site-packages/setuptools/__init__.py
@@ -18,6 +18,7 @@ from setuptools.extension import Extension
from setuptools.dist import Distribution
from setuptools.depends import Require
from . import monkey
+from . import logging
__all__ = [
@@ -149,6 +150,7 @@ def _install_setup_requires(attrs):
def setup(**attrs):
# Make sure we have any requirements needed to interpret 'attrs'.
+ logging.configure()
_install_setup_requires(attrs)
return distutils.core.setup(**attrs)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py b/venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py
index b7a0608..c41ea9a 100644
--- a/venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py
+++ b/venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py
@@ -527,7 +527,7 @@ class MSVCCompiler(CCompiler) :
return
warnings.warn(
"Fallback spawn triggered. Please update distutils monkeypatch.")
- with unittest.mock.patch('os.environ', env):
+ with unittest.mock.patch.dict('os.environ', env):
bag.value = super().spawn(cmd)
# -- Miscellaneous methods -----------------------------------------
diff --git a/venv/Lib/site-packages/setuptools/_distutils/command/install.py b/venv/Lib/site-packages/setuptools/_distutils/command/install.py
index 40be5ba..cdcc052 100644
--- a/venv/Lib/site-packages/setuptools/_distutils/command/install.py
+++ b/venv/Lib/site-packages/setuptools/_distutils/command/install.py
@@ -81,11 +81,6 @@ if HAS_USER_SITE:
'data' : '{userbase}',
}
- INSTALL_SCHEMES['osx_framework_user'] = {
- 'headers':
- '{userbase}/include/{implementation_lower}{py_version_short}{abiflags}/{dist_name}',
- }
-
# The keys to an installation scheme; if any new types of files are to be
# installed, be sure to add an entry to every installation scheme above,
# and to SCHEME_KEYS here.
@@ -124,7 +119,8 @@ def _get_implementation():
def _select_scheme(ob, name):
- vars(ob).update(_remove_set(ob, _scheme_attrs(_resolve_scheme(name))))
+ scheme = _inject_headers(name, _load_scheme(_resolve_scheme(name)))
+ vars(ob).update(_remove_set(ob, _scheme_attrs(scheme)))
def _remove_set(ob, attrs):
@@ -147,9 +143,26 @@ def _resolve_scheme(name):
return resolved
-def _scheme_attrs(name):
+def _load_scheme(name):
+ return _load_schemes()[name]
+
+
+def _inject_headers(name, scheme):
+ """
+ Given a scheme name and the resolved scheme,
+ if the scheme does not include headers, resolve
+ the fallback scheme for the name and use headers
+ from it. pypa/distutils#88
+ """
+ # Bypass the preferred scheme, which may not
+ # have defined headers.
+ fallback = _load_scheme(_pypy_hack(name))
+ scheme.setdefault('headers', fallback['headers'])
+ return scheme
+
+
+def _scheme_attrs(scheme):
"""Resolve install directories by applying the install schemes."""
- scheme = _load_schemes()[name]
return {
f'install_{key}': scheme[key]
for key in SCHEME_KEYS
@@ -395,6 +408,7 @@ class install(Command):
'platlibdir': getattr(sys, 'platlibdir', 'lib'),
'implementation_lower': _get_implementation().lower(),
'implementation': _get_implementation(),
+ 'platsubdir': sysconfig.get_config_var('platsubdir'),
}
if HAS_USER_SITE:
@@ -635,7 +649,7 @@ class install(Command):
return
home = convert_path(os.path.expanduser("~"))
for name, path in self.config_vars.items():
- if path.startswith(home) and not os.path.isdir(path):
+ if str(path).startswith(home) and not os.path.isdir(path):
self.debug_print("os.makedirs('%s', 0o700)" % path)
os.makedirs(path, 0o700)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py b/venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py
index 09be5ba..fd082f6 100644
--- a/venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py
+++ b/venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py
@@ -51,16 +51,14 @@ import os
import sys
import copy
import shlex
-from subprocess import Popen, PIPE, check_output
-import re
+import warnings
+from subprocess import check_output
-import distutils.version
from distutils.unixccompiler import UnixCCompiler
from distutils.file_util import write_file
from distutils.errors import (DistutilsExecError, CCompilerError,
CompileError, UnknownFileError)
-from distutils.version import LooseVersion
-from distutils.spawn import find_executable
+from distutils.version import LooseVersion, suppress_known_deprecation
def get_msvcr():
"""Include the appropriate MSVC runtime library if Python was built
@@ -125,33 +123,8 @@ class CygwinCCompiler(UnixCCompiler):
self.cc = os.environ.get('CC', 'gcc')
self.cxx = os.environ.get('CXX', 'g++')
- if ('gcc' in self.cc): # Start gcc workaround
- self.gcc_version, self.ld_version, self.dllwrap_version = \
- get_versions()
- self.debug_print(self.compiler_type + ": gcc %s, ld %s, dllwrap %s\n" %
- (self.gcc_version,
- self.ld_version,
- self.dllwrap_version) )
-
- # ld_version >= "2.10.90" and < "2.13" should also be able to use
- # gcc -mdll instead of dllwrap
- # Older dllwraps had own version numbers, newer ones use the
- # same as the rest of binutils ( also ld )
- # dllwrap 2.10.90 is buggy
- if self.ld_version >= "2.10.90":
- self.linker_dll = self.cc
- else:
- self.linker_dll = "dllwrap"
-
- # ld_version >= "2.13" support -shared so use it instead of
- # -mdll -static
- if self.ld_version >= "2.13":
- shared_option = "-shared"
- else:
- shared_option = "-mdll -static"
- else: # Assume linker is up to date
- self.linker_dll = self.cc
- shared_option = "-shared"
+ self.linker_dll = self.cc
+ shared_option = "-shared"
self.set_executables(compiler='%s -mcygwin -O -Wall' % self.cc,
compiler_so='%s -mcygwin -mdll -O -Wall' % self.cc,
@@ -160,17 +133,24 @@ class CygwinCCompiler(UnixCCompiler):
linker_so=('%s -mcygwin %s' %
(self.linker_dll, shared_option)))
- # cygwin and mingw32 need different sets of libraries
- if ('gcc' in self.cc and self.gcc_version == "2.91.57"):
- # cygwin shouldn't need msvcrt, but without the dlls will crash
- # (gcc version 2.91.57) -- perhaps something about initialization
- self.dll_libraries=["msvcrt"]
- self.warn(
- "Consider upgrading to a newer version of gcc")
- else:
- # Include the appropriate MSVC runtime library if Python was built
- # with MSVC 7.0 or later.
- self.dll_libraries = get_msvcr()
+ # Include the appropriate MSVC runtime library if Python was built
+ # with MSVC 7.0 or later.
+ self.dll_libraries = get_msvcr()
+
+ @property
+ def gcc_version(self):
+ # Older numpy dependend on this existing to check for ancient
+ # gcc versions. This doesn't make much sense with clang etc so
+ # just hardcode to something recent.
+ # https://github.com/numpy/numpy/pull/20333
+ warnings.warn(
+ "gcc_version attribute of CygwinCCompiler is deprecated. "
+ "Instead of returning actual gcc version a fixed value 11.2.0 is returned.",
+ DeprecationWarning,
+ stacklevel=2,
+ )
+ with suppress_known_deprecation():
+ return LooseVersion("11.2.0")
def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
"""Compiles the source by spawning GCC and windres if needed."""
@@ -232,24 +212,17 @@ class CygwinCCompiler(UnixCCompiler):
# next add options for def-file and to creating import libraries
- # dllwrap uses different options than gcc/ld
- if self.linker_dll == "dllwrap":
- extra_preargs.extend(["--output-lib", lib_file])
- # for dllwrap we have to use a special option
- extra_preargs.extend(["--def", def_file])
- # we use gcc/ld here and can be sure ld is >= 2.9.10
- else:
- # doesn't work: bfd_close build\...\libfoo.a: Invalid operation
- #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file])
- # for gcc/ld the def-file is specified as any object files
- objects.append(def_file)
+ # doesn't work: bfd_close build\...\libfoo.a: Invalid operation
+ #extra_preargs.extend(["-Wl,--out-implib,%s" % lib_file])
+ # for gcc/ld the def-file is specified as any object files
+ objects.append(def_file)
#end: if ((export_symbols is not None) and
# (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
# who wants symbols and a many times larger output file
# should explicitly switch the debug mode on
- # otherwise we let dllwrap/ld strip the output file
+ # otherwise we let ld strip the output file
# (On my machine: 10KiB < stripped_file < ??100KiB
# unstripped_file = stripped_file + XXX KiB
# ( XXX=254 for a typical python extension))
@@ -297,19 +270,7 @@ class Mingw32CCompiler(CygwinCCompiler):
CygwinCCompiler.__init__ (self, verbose, dry_run, force)
- # ld_version >= "2.13" support -shared so use it instead of
- # -mdll -static
- if ('gcc' in self.cc and self.ld_version < "2.13"):
- shared_option = "-mdll -static"
- else:
- shared_option = "-shared"
-
- # A real mingw32 doesn't need to specify a different entry point,
- # but cygwin 2.91.57 in no-cygwin-mode needs it.
- if ('gcc' in self.cc and self.gcc_version <= "2.91.57"):
- entry_point = '--entry _DllMain@12'
- else:
- entry_point = ''
+ shared_option = "-shared"
if is_cygwincc(self.cc):
raise CCompilerError(
@@ -319,9 +280,9 @@ class Mingw32CCompiler(CygwinCCompiler):
compiler_so='%s -mdll -O -Wall' % self.cc,
compiler_cxx='%s -O -Wall' % self.cxx,
linker_exe='%s' % self.cc,
- linker_so='%s %s %s'
- % (self.linker_dll, shared_option,
- entry_point))
+ linker_so='%s %s'
+ % (self.linker_dll, shared_option))
+
# Maybe we should also append -mthreads, but then the finished
# dlls need another dll (mingwm10.dll see Mingw32 docs)
# (-mthreads: Support thread-safe exception handling on `Mingw32')
@@ -388,39 +349,14 @@ def check_config_h():
return (CONFIG_H_UNCERTAIN,
"couldn't read '%s': %s" % (fn, exc.strerror))
-RE_VERSION = re.compile(br'(\d+\.\d+(\.\d+)*)')
-
-def _find_exe_version(cmd):
- """Find the version of an executable by running `cmd` in the shell.
-
- If the command is not found, or the output does not match
- `RE_VERSION`, returns None.
- """
- executable = cmd.split()[0]
- if find_executable(executable) is None:
- return None
- out = Popen(cmd, shell=True, stdout=PIPE).stdout
- try:
- out_string = out.read()
- finally:
- out.close()
- result = RE_VERSION.search(out_string)
- if result is None:
- return None
- # LooseVersion works with strings; decode
- ver_str = result.group(1).decode()
- with distutils.version.suppress_known_deprecation():
- return LooseVersion(ver_str)
-
-def get_versions():
- """ Try to find out the versions of gcc, ld and dllwrap.
-
- If not possible it returns None for it.
- """
- commands = ['gcc -dumpversion', 'ld -v', 'dllwrap --version']
- return tuple([_find_exe_version(cmd) for cmd in commands])
-
def is_cygwincc(cc):
'''Try to determine if the compiler that would be used is from cygwin.'''
out_string = check_output(shlex.split(cc) + ['-dumpmachine'])
return out_string.strip().endswith(b'cygwin')
+
+
+get_versions = None
+"""
+A stand-in for the previous get_versions() function to prevent failures
+when monkeypatched. See pypa/setuptools#2969.
+"""
diff --git a/venv/Lib/site-packages/setuptools/_distutils/log.py b/venv/Lib/site-packages/setuptools/_distutils/log.py
index 8ef6b28..a68b156 100644
--- a/venv/Lib/site-packages/setuptools/_distutils/log.py
+++ b/venv/Lib/site-packages/setuptools/_distutils/log.py
@@ -3,13 +3,14 @@
# The class here is styled after PEP 282 so that it could later be
# replaced with a standard Python logging implementation.
+import sys
+
DEBUG = 1
INFO = 2
WARN = 3
ERROR = 4
FATAL = 5
-import sys
class Log:
@@ -54,6 +55,7 @@ class Log:
def fatal(self, msg, *args):
self._log(FATAL, msg, args)
+
_global_log = Log()
log = _global_log.log
debug = _global_log.debug
@@ -62,12 +64,14 @@ warn = _global_log.warn
error = _global_log.error
fatal = _global_log.fatal
+
def set_threshold(level):
# return the old threshold for use from tests
old = _global_log.threshold
_global_log.threshold = level
return old
+
def set_verbosity(v):
if v <= 0:
set_threshold(WARN)
diff --git a/venv/Lib/site-packages/setuptools/_distutils/sysconfig.py b/venv/Lib/site-packages/setuptools/_distutils/sysconfig.py
index d36d94f..4a77a43 100644
--- a/venv/Lib/site-packages/setuptools/_distutils/sysconfig.py
+++ b/venv/Lib/site-packages/setuptools/_distutils/sysconfig.py
@@ -13,6 +13,7 @@ import _imp
import os
import re
import sys
+import sysconfig
from .errors import DistutilsPlatformError
@@ -274,31 +275,15 @@ def get_config_h_filename():
inc_dir = os.path.join(_sys_home or project_base, "PC")
else:
inc_dir = _sys_home or project_base
+ return os.path.join(inc_dir, 'pyconfig.h')
else:
- inc_dir = get_python_inc(plat_specific=1)
+ return sysconfig.get_config_h_filename()
- return os.path.join(inc_dir, 'pyconfig.h')
-
-
-# Allow this value to be patched by pkgsrc. Ref pypa/distutils#16.
-_makefile_tmpl = 'config-{python_ver}{build_flags}{multiarch}'
def get_makefile_filename():
"""Return full pathname of installed Makefile from the Python build."""
- if python_build:
- return os.path.join(_sys_home or project_base, "Makefile")
- lib_dir = get_python_lib(plat_specific=0, standard_lib=1)
- multiarch = (
- '-%s' % sys.implementation._multiarch
- if hasattr(sys.implementation, '_multiarch') else ''
- )
- config_file = _makefile_tmpl.format(
- python_ver=get_python_version(),
- build_flags=build_flags,
- multiarch=multiarch,
- )
- return os.path.join(lib_dir, config_file, 'Makefile')
+ return sysconfig.get_makefile_filename()
def parse_config_h(fp, g=None):
@@ -308,26 +293,7 @@ def parse_config_h(fp, g=None):
optional dictionary is passed in as the second argument, it is
used instead of a new dictionary.
"""
- if g is None:
- g = {}
- define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
- undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
- #
- while True:
- line = fp.readline()
- if not line:
- break
- m = define_rx.match(line)
- if m:
- n, v = m.group(1, 2)
- try: v = int(v)
- except ValueError: pass
- g[n] = v
- else:
- m = undef_rx.match(line)
- if m:
- g[m.group(1)] = 0
- return g
+ return sysconfig.parse_config_h(fp, vars=g)
# Regexes needed for parsing Makefile (and similar syntaxes,