hyb
2025-12-23 10f3a1daddfbc7fa3dd2069197d83e8b6ef19176
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
Ë
Iñúh&+ãó”—dZddlZddlZddlZddlmZddlZddlmZddlmZddlm    Z    ddlm
Z
ddlm Z dd    lm Z dd
l mZdd l mZdd l mZdd l mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl mZddl m Z ddl m!Z!ddl m"Z"d„Z#Gd „d!e«Z$ejJjMd"¬#«ejJjOed$¬%«Gd&„d'e$«««Z(ejJjOed(¬%«Gd)„d*e(««Z)Gd+„d,e$«Z*y)-aYNotes about unicode handling in psutil
======================================.
 
Starting from version 5.3.0 psutil adds unicode support, see:
https://github.com/giampaolo/psutil/issues/1040
The notes below apply to *any* API returning a string such as
process exe(), cwd() or username():
 
* all strings are encoded by using the OS filesystem encoding
  (sys.getfilesystemencoding()) which varies depending on the platform
  (e.g. "UTF-8" on macOS, "mbcs" on Win)
* no API call is supposed to crash with UnicodeDecodeError
* instead, in case of badly encoded data returned by the OS, the
  following error handlers are used to replace the corrupted characters in
  the string:
    * sys.getfilesystemencodeerrors() or "surrogatescape" on POSIX and
      "replace" on Windows.
 
For a detailed explanation of how psutil handles unicode see #1040.
 
Tests
=====
 
List of APIs returning or dealing with a string:
('not tested' means they are not tested to deal with non-ASCII strings):
 
* Process.cmdline()
* Process.cwd()
* Process.environ()
* Process.exe()
* Process.memory_maps()
* Process.name()
* Process.net_connections('unix')
* Process.open_files()
* Process.username()             (not tested)
 
* disk_io_counters()             (not tested)
* disk_partitions()              (not tested)
* disk_usage(str)
* net_connections('unix')
* net_if_addrs()                 (not tested)
* net_if_stats()                 (not tested)
* net_io_counters()              (not tested)
* sensors_fans()                 (not tested)
* sensors_temperatures()         (not tested)
* users()                        (not tested)
 
* WindowsService.binpath()       (not tested)
* WindowsService.description()   (not tested)
* WindowsService.display_name()  (not tested)
* WindowsService.name()          (not tested)
* WindowsService.status()        (not tested)
* WindowsService.username()      (not tested)
 
In here we create a unicode path with a funky non-ASCII name and (where
possible) make psutil return it back (e.g. on name(), exe(), open_files(),
etc.) and make sure that:
 
* psutil never crashes with UnicodeDecodeError
* the returned path matches
éN)Úclosing)ÚBSD©ÚMACOS)ÚNETBSD)ÚOPENBSD)ÚPOSIX)ÚWINDOWS)ÚASCII_FS)Ú
CI_TESTING)Ú HAS_ENVIRON)ÚHAS_MEMORY_MAPS)ÚHAS_NET_CONNECTIONS_UNIX)ÚINVALID_UNICODE_SUFFIX)ÚPYPY)Ú TESTFN_PREFIX)ÚUNICODE_SUFFIX)ÚPsutilTestCase)Úbind_unix_socket)Úchdir)Úcopyload_shared_lib)Ú create_py_exe)Ú
get_testfn)Úpytest)Ú
safe_mkdir)Ú safe_rmpath)Úskip_on_access_denied)Ú spawn_subproc)Ú    terminatecó|—d}t|¬«}    t|«t|«t|g¬«}t    j
||dz«t|dz«    | t |«t|«y#ttf$rY| t |«t|«ywxYw#| t |«t|«wxYw)z`Return True if both the fs and the subprocess module can
    deal with a unicode file name.
    N©Úsuffix)Úcmdz-2TF)    rrrrÚshutilÚcopyfilerÚUnicodeEncodeErrorÚOSError)r"ÚsprocÚtestfns   úLH:\Change_password\venv_build\Lib\site-packages\psutil/tests/test_unicode.pyÚ try_unicoder+hs·€ð €EÜ ˜vÔ &€Fð ܐFÔܐfÔÜ 6 (Ô+ˆÜ‰˜ ¨¡ Ô.ܐF˜T‘MÔ"ðà Ð Ü eÔ ÜFÕøô ¤Ð (òØð Ð Ü eÔ ÜFÕðûð
Ð Ü eÔ ÜFÕús$A
A4Á4BÂB!ÂBÂB!Â!B;có6‡—eZdZdZeˆfd„«Zˆfd„ZˆxZS)ÚBaseUnicodeTestNcóò•—t‰|«d|_d|_|jNt |j«sd|_yt |j¬«|_t|j«yy)NFTr!)ÚsuperÚ
setUpClassÚ
skip_testsÚ
funky_nameÚ funky_suffixr+rr)ÚclsÚ    __class__s €r*r0zBaseUnicodeTest.setUpClass†s`ø€ä ‰ÑÔØˆŒØˆŒØ × Ñ Ð 'ܘs×/Ñ/Ô0Ø!%•ä!+°3×3CÑ3CÔ!D”ܘcŸn™nÕ-ð (ócód•—t‰|«|jrtjd«Sy)Nzcan't handle unicode str)r/ÚsetUpr1rÚskip)Úselfr5s €r*r8zBaseUnicodeTest.setUp’s(ø€Ü ‰‰ ŒØ ?Š?Ü—;‘;Ð9Ó:Ð :ð r6)Ú__name__Ú
__module__Ú __qualname__r3Ú classmethodr0r8Ú __classcell__)r5s@r*r-r-ƒs$ø„Ø€Làó    .óð    .÷;ð;r6r-Úserial)ÚnamezASCII fs©Úreasoncó>—eZdZdZeZd„Zd„Zd„Zd„Z    d„Z
e jjexred¬«e jjexsed    ¬«d
„««Ze jje d ¬«e jje d ¬«d „««Ze jje d ¬«e jje d ¬«e«d„«««Zd„Ze jje d¬«d„«Zy)Ú
TestFSAPIsz1Test FS APIs with a funky, valid, UTF8 path name.có—tj«5tjd«|jt    j
d«vcddd«S#1swYyxYw)NÚignoreú.)ÚwarningsÚcatch_warningsÚ simplefilterr2ÚosÚlistdir©r:s r*Úexpect_exact_path_matchz"TestFSAPIs.expect_exact_path_matchŸsE€Ü × $Ñ $Ó &ñ    6Ü × !Ñ ! (Ô +Ø—?‘?¤b§j¡j°£oÐ5÷    6÷    6ò    6ús •6AÁAcó~—|jddg}|j|«}tj|j«}|j «}t |t«sJ‚|j«rLtjj|«tjj|j«k(sJ‚yy©Nz-cz2import time; [time.sleep(0.1) for x in range(100)]) r2rÚpsutilÚProcessÚpidÚexeÚ
isinstanceÚstrrOrLÚpathÚnormcase)r:r#ÚsubpÚprUs     r*Ú test_proc_exezTestFSAPIs.test_proc_exe¦s–€à O‰OØ Ø @ð
ˆð
×!Ñ! #Ó&ˆÜ N‰N˜4Ÿ8™8Ó $ˆØe‰e‹gˆÜ˜#œsÔ#Ð#Ð#Ø × 'Ñ 'Ô )Ü—7‘7×#Ñ# CÓ(¬B¯G©G×,<Ñ,<¸T¿_¹_Ó,MÒMÐ MÑMð *r6có@—|jddg}|j|«}tj|j«j «}t |t«sJ‚|j«r/|tjj|j«k(sJ‚yyrQ) r2rrRrSrTrArVrWrOrLrXÚbasename)r:r#rZrAs    r*Útest_proc_namezTestFSAPIs.test_proc_name³s…€à O‰OØ Ø @ð
ˆð
×!Ñ! #Ó&ˆÜ~‰~˜dŸh™hÓ'×,Ñ,Ó.ˆÜ˜$¤Ô$Ð$Ð$Ø × 'Ñ 'Ô )Øœ2Ÿ7™7×+Ñ+¨D¯O©OÓ<Ò<Ð <Ñ<ð *r6có—|jddg}|j|«}tj|j«}|j «}|D]}t |t«rŒJ‚|j«r||k(sJ‚yyrQ)    r2rrRrSrTÚcmdlinerVrWrO)r:r#rZr[raÚparts      r*Útest_proc_cmdlinezTestFSAPIs.test_proc_cmdline¿s€à O‰OØ Ø @ð
ˆð
×!Ñ! #Ó&ˆÜ N‰N˜4Ÿ8™8Ó $ˆØ—)‘)“+ˆØò    )ˆDܘd¤CÕ(Ð (Ð(ð    )à × 'Ñ 'Ô )ؘc’>Ð !‘>ð *r6có\—|jdz}|jt|«t|«t    |«5t j «}|j«}ddd«tj«t«sJ‚|j«r|k(sJ‚yy#1swYŒBxYw©NÚ2) r2Ú
addCleanuprrrrRrSÚcwdrVrWrO)r:Údnamer[rhs    r*Ú test_proc_cwdzTestFSAPIs.test_proc_cwdÍsŽ€Ø—‘ #Ñ%ˆØ ‰œ  UÔ+ܐ5ÔÜ 5‹\ñ    Ü—‘Ó ˆAØ—%‘%“'ˆC÷    ô˜!Ÿ%™%›'¤3Ô'Ð'Ð'Ø × 'Ñ 'Ô )ؘ%’<Ð ‘<ð *÷        ð    ús ¼%B"Â"B+zfails on PYPY + WINDOWSrBzbroken on NETBSD or OPENBSDcó6—tj«}t|j««}t    |j
d«5t|j««}ddd«|z
j «j}t|t«sJ‚tr|stjd«S|j«rLtjj|«tjj|j
«k(sJ‚yy#1swYŒ²xYw)NÚrbzopen_files on BSD is broken)rRrSÚsetÚ
open_filesÚopenr2ÚpoprXrVrWrrr9rOrLrY)r:r[ÚstartÚnewrXs     r*Útest_proc_open_fileszTestFSAPIs.test_proc_open_filesØsрô
N‰NÓ ˆÜA—L‘L“NÓ#ˆÜ $—/‘/ 4Ó (ñ    &ܐa—l‘l“nÓ%ˆC÷    &àe‘ × Ñ Ó"×'Ñ'ˆÜ˜$¤Ô$Ð$Ð$Ý ‘tä—;‘;Ð<Ó=Ð =Ø × 'Ñ 'Ô )Ü—7‘7×#Ñ# DÓ)¬R¯W©W×-=Ñ-=¸d¿o¹oÓ-NÒNÐ NÑNð *÷    &ð    &ús ÁDÄDz
POSIX onlyzcan't list UNIX socketscó¦—|j|j¬«}t|«}t|«5t    j
«j d«d}t|jt«sJ‚|js*tr$trtjd«cddd«S|j|k(sJ‚    ddd«y#1swYyxYw)Nr!Úunixrzunreliable on OSX)rr3rrrRrSÚnet_connectionsrVÚladdrrWrr rr9)r:rAÚsockÚconns    r*Útest_proc_net_connectionsz$TestFSAPIs.test_proc_net_connectionsés¦€ð
‰ d×&7Ñ&7ˆÓ8ˆÜ Ó%ˆÜ T‹]ñ    &Ü—>‘>Ó#×3Ñ3°FÓ;¸AÑ>ˆDܘdŸj™j¬#Ô.Ð .Ð.Ø—:’:¥%­JÜ—{‘{Ð#6Ó7÷        &ñ    &ð
—:‘: Ò%Ð %Ñ%÷     &÷    &ñ    &ús³A/CÂ,CÃCcó0—d„}|j|j¬«}t|«}t|«5t    j
d¬«}||«}t |jt«sJ‚|j|k(sJ‚    ddd«y#1swYyxYw)Ncó¦—|D]B}tjj|j«j    t
«sŒ@|cSt d«‚)Nzconnection not found)rLrXr^rwÚ
startswithrÚ
ValueError)Úconsrys  r*Ú    find_sockz2TestFSAPIs.test_net_connections.<locals>.find_sockýsE€Øò  Ü—7‘7×#Ñ# D§J¡JÓ/×:Ñ:¼=ÕIØ’Kð  ôÐ3Ó4Ð 4r6r!ru)Úkind)    rr3rrrRrvrVrwrW)r:r€rArxrrys      r*Útest_net_connectionszTestFSAPIs.test_net_connections÷s„€ò     5𠏉 d×&7Ñ&7ˆÓ8ˆÜ Ó%ˆÜ T‹]ñ    &Ü×)Ñ)¨vÔ6ˆDÙ˜T“?ˆDܘdŸj™j¬#Ô.Ð .Ð.Ø—:‘: Ò%Ð %Ñ%÷        &÷    &ñ    &ús ¶A B  BcóŽ—|jdz}|jt|«t|«t    j
|«yre)r2rgrrrRÚ
disk_usage)r:ris  r*Útest_disk_usagezTestFSAPIs.test_disk_usage s4€Ø—‘ #Ñ%ˆØ ‰œ  UÔ+ܐ5ÔÜ×ј%Õ r6ú not supportedcón—t|j¬«5}d„}tj«j    «Dcgc]}||j
«‘Œ}}|Dcgc] }t |vsŒ |‘Œ}}||«|vsJ‚|D]}t|t«rŒJ‚    ddd«ycc}wcc}w#1swYyxYw)Nr!cóz—tjjtjj|««S©N)rLrXÚrealpathrY)r[s r*Únormpathz-TestFSAPIs.test_memory_maps.<locals>.normpaths&€Ü—w‘w×'Ñ'¬¯©×(8Ñ(8¸Ó(;Ó<Ð<r6)    rr3rRrSÚ memory_mapsrXrrVrW)r:Ú
funky_pathr‹ÚxÚlibpathsrXs      r*Útest_memory_mapszTestFSAPIs.test_memory_mapss¿€ä  ¨×(9Ñ(9Ô :ð     -¸jò =ô+1¯.©.Ó*:×*FÑ*FÓ*HöØ%&‘˜Ÿ™Õ ðˆHðð$,ÖB˜a¬}ÀÒ/AšÐBˆHÐBÙ˜JÓ'¨8Ñ3Ð 3Ð3Ø ò -Ü! $¬Õ,Ð,Ð,ñ -÷     -ð     -ùò
ùòC÷     -ð     -ús4—(B+¿B!ÁB+Á B&Á,B&Á0#B+ÂB+Â!
B+Â+B4N)r;r<r=Ú__doc__rr3rOr\r_rcrjrÚmarkÚskipifrr
rrrsr    rrzrr‚r…rr©r6r*rErE˜sZ„ñ<à!€Lò6ò Nò
=ò "ò     ð ‡[[×јÒ( Ð1JÐÓKØ ‡[[×ÑØÒ'Ð"?ðóñ OóóLð Oð ‡[[×јE˜    ¨,ÐÓ7Ø ‡[[×ÑØ $Ð$Ð-Fðóñ&óó8ð&ð ‡[[×јE˜    ¨,ÐÓ7Ø ‡[[×ÑØ $Ð$Ð-FðóñÓñ &óóó8ð
&ò!ð  ‡[[×јOÐ+°OÐÓDñ -óEñ -r6rEzunreliable on CIcó—eZdZdZeZd„Zy)ÚTestFSAPIsWithInvalidPathz-Test FS APIs with a funky, invalid path name.có—t Sr‰rrNs r*rOz1TestFSAPIsWithInvalidPath.expect_exact_path_match(s
€ÜˆyÐr6N)r;r<r=r‘rr3rOr”r6r*r–r–"s„á7à)€Lór6r–có¤—eZdZdZeZejje     d¬«ejje
xre d¬«d„««Z y)Ú TestNonFSAPISz&Unicode tests for non fs-related APIs.r†rBzsegfaults on PYPY + WINDOWScó€—tjj«}|j|d<|j    |¬«}t j |j«}|j«}|j«D])\}}t|t«sJ‚t|t«rŒ)J‚|d|jk(sJ‚y)NÚ    FUNNY_ARG)Úenv) rLÚenvironÚcopyr3rrRrSrTÚitemsrVrW)r:rœr(r[ÚkÚvs      r*Útest_proc_environzTestNonFSAPIS.test_proc_environ6s¨€ô
j‰jo‰oÓˆØ×,Ñ,ˆˆKÑØ×"Ñ" sÐ"Ó+ˆÜ N‰N˜5Ÿ9™9Ó %ˆØi‰i‹kˆØ—I‘I“Kò    &‰DˆAˆqܘa¤Ô%Ð %Ð%ܘa¤Õ%Ð %Ð%ð    &ð;Ñ 4×#4Ñ#4Ò4Ð4Ñ4r6N) r;r<r=r‘rr3rr’r“r rr
r¢r”r6r*r™r™1sV„Ù0à!€Là ‡[[×јK˜°ÐÓ@Ø ‡[[×јÒ( Ð1NÐÓOñ 5óPóAñ 5r6r™)+r‘rLr$rIÚ
contextlibrrRrrrrr    r
Ú psutil.testsr r r rrrrrrrrrrrrrrrrrrr+r-r’Ú xdist_groupr“rEr–r™r”r6r*ú<module>r¦sðñ<ó|
Û ÛÝã ÝÝÝÝÝÝÝ!Ý#Ý$Ý(Ý1Ý/ÝÝ&Ý'Ý'Ý)ÝÝ,Ý&Ý#ÝÝ#Ý$Ý.Ý&Ý"òô6;nô;ð*‡×јhÐÓ'؇×ѐH ZÐÓ0ôE-óE-ó1ó(ðE-ðP‡×ѐJÐ'9ÐÓ:ô 
óó;ðô5Oõ5r6