From 4daaec805ce4174c629c92a022d56d9d4c0c7755 Mon Sep 17 00:00:00 2001 From: Roger Ye Date: Sat, 17 Apr 2021 11:56:29 +0800 Subject: [PATCH 1/3] Updated README.rst --- README.rst | 8 ++++++++ kpclibpy/commands/keepass.py | 7 ++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index e84edb8..6a7fb11 100755 --- a/README.rst +++ b/README.rst @@ -69,6 +69,14 @@ A Dockr image - `docker-mono `__ can be used on Linux or Windows 10 (WSL). +Configuration +------------- + +The default location for database files is at $HOME/.kpclibdb (or %USERPROFILE%\.kpclibdb on Windows). To change the default location, a configuration file kpclibpy.ini can be created in the folder $HOME/.kpclibdb. +:: + [DEFAULT] + homepath = {your data path} + Issues ------ On Windows platform, you may get the below error message: diff --git a/kpclibpy/commands/keepass.py b/kpclibpy/commands/keepass.py index 6977581..dcdf743 100644 --- a/kpclibpy/commands/keepass.py +++ b/kpclibpy/commands/keepass.py @@ -332,12 +332,13 @@ def connect(self, filename, password): """ self._db = PxDatabase() try: - self._db.DefaultFolder = get_homepath() + homepath = get_homepath() + self._db.DefaultFolder = homepath self._db.Open(filename, password) except InvalidCompositeKeyException: + cprint("connect: The composite key is invalid!\npath={}, file={}".format(homepath, filename), "red") self.close() self._db = None - cprint("open: The composite key is invalid!", "red") return def open(self, db_path, password, logger): @@ -383,4 +384,4 @@ def move_entry(self, src_entry, dst_group): if self._db.MoveEntry(src_entry, dst_group): print("Moved {} to {}".format(src_entry.get_Name(), dst_group.get_Name())) else: - print("Cannot move {} to {}".format(src_entry.get_Name(), dst_group.get_Name())) \ No newline at end of file + print("Cannot move {} to {}".format(src_entry.get_Name(), dst_group.get_Name())) From 5828eecd5876878a722dbc1059d351ade8b3a406 Mon Sep 17 00:00:00 2001 From: Roger Ye Date: Sat, 17 Apr 2021 18:47:59 +0800 Subject: [PATCH 2/3] Build 1.1.6 --- kpclibpy/__init__.py | 2 +- kpclibpy/commands/database_cmds.py | 7 ++-- kpclibpy/commands/keepass.py | 16 +++++++-- kpclibpy/kpclib/kpclib.py | 1 + kpclibpy/kpclib/lib/KPCLib.dll | Bin 301056 -> 301056 bytes kpclibpy/kpclib/lib/PassXYZ.dll | Bin 115200 -> 116224 bytes kpclibpy/kpclib/lib/PassXYZLib.dll | Bin 26112 -> 26112 bytes kpclibpy/unit_test.ipynb | 54 +++++++++++++++-------------- 8 files changed, 48 insertions(+), 32 deletions(-) mode change 100644 => 100755 kpclibpy/kpclib/lib/PassXYZ.dll diff --git a/kpclibpy/__init__.py b/kpclibpy/__init__.py index 976b9bd..02c39fc 100644 --- a/kpclibpy/__init__.py +++ b/kpclibpy/__init__.py @@ -33,5 +33,5 @@ __email__ = metadata["author-email"] __license__ = metadata["license"] except ModuleNotFoundError: - __version__ = "1.1.5.dev0" + __version__ = "1.1.6.dev0" print("Debug build ", __version__) \ No newline at end of file diff --git a/kpclibpy/commands/database_cmds.py b/kpclibpy/commands/database_cmds.py index 0236f0c..650e7d1 100644 --- a/kpclibpy/commands/database_cmds.py +++ b/kpclibpy/commands/database_cmds.py @@ -11,7 +11,7 @@ from prettytable import PrettyTable from termcolor import cprint, colored from nubia import command, argument, context -from kpclibpy.commands.keepass import IStatusLogger, get_homepath, lsdb +from kpclibpy.commands.keepass import IStatusLogger, get_homepath, lsdb, get_username #from KeePassLib import PwGroup, PwEntry, Collections @@ -164,6 +164,7 @@ def version(): ctx = context.get_context() en_table.add_row([colored("KPCLibPy", "yellow"), ctx.version]) en_table.add_row([colored("KPCLib", "yellow"), "{}".format(ctx.keepass.version)]) + en_table.add_row([colored("PassXYZ", "yellow"), "{}".format(ctx.keepass.version1)]) if ctx.keepass.is_open(): en_table.add_row([colored("CurrentGroup", "yellow"), "{}".format(ctx.keepass.current_group)]) @@ -226,11 +227,11 @@ def show(items): version() elif items == "databases": print("The current path: ", get_homepath()) - db_table = PrettyTable(["No.", "Name"]) + db_table = PrettyTable(["No.", "Username", "File Name"]) db_table.align = "l" num = 1 for file in lsdb(): - db_table.add_row([num, file]) + db_table.add_row([num, get_username(file), file]) num = num + 1 print(db_table) elif items == "help": diff --git a/kpclibpy/commands/keepass.py b/kpclibpy/commands/keepass.py index dcdf743..ee4e336 100644 --- a/kpclibpy/commands/keepass.py +++ b/kpclibpy/commands/keepass.py @@ -24,8 +24,12 @@ from KeePassLib.Security import ProtectedString from KeePassLib.Serialization import IOConnectionInfo from PassXYZLib import PxDefs, PxDatabase, PxLibInfo +from PassXYZ.Services import PxKeyProvider +def get_username(filename): + return PxDefs.GetUserNameFromDataFile(filename) + def get_homepath(): config_file = str(Path.home())+'/.kpclibdb/kpclibpy.ini' @@ -71,6 +75,14 @@ def __init__(self): self._user_name = None self.is_hidden = True + @property + def version1(self): + """ + ReadOnly property to represent the version of PassXYZ + """ + return PxKeyProvider.Version + + @property def version(self): """ @@ -335,8 +347,8 @@ def connect(self, filename, password): homepath = get_homepath() self._db.DefaultFolder = homepath self._db.Open(filename, password) - except InvalidCompositeKeyException: - cprint("connect: The composite key is invalid!\npath={}, file={}".format(homepath, filename), "red") + except InvalidCompositeKeyException as ex: + cprint("connect: The composite key is invalid!\npath={}, file={}\n{}".format(homepath, filename, ex), "red") self.close() self._db = None return diff --git a/kpclibpy/kpclib/kpclib.py b/kpclibpy/kpclib/kpclib.py index a2f909c..2d06926 100644 --- a/kpclibpy/kpclib/kpclib.py +++ b/kpclibpy/kpclib/kpclib.py @@ -31,6 +31,7 @@ def interop_dll_path(dll_name): clr.AddReference(interop_dll_path('KPCLib.dll')) clr.AddReference(interop_dll_path('SkiaSharp.dll')) clr.AddReference(interop_dll_path('PassXYZLib.dll')) +clr.AddReference(interop_dll_path('PassXYZ.dll')) if __name__ == '__main__': from KeePassLib import PwDatabase, PwGroup diff --git a/kpclibpy/kpclib/lib/KPCLib.dll b/kpclibpy/kpclib/lib/KPCLib.dll index ed261bfcfc202e4a415389db694787e369059bb8..893db5d3ea36bfd8d5ebefd75ccb1fbb2809404f 100755 GIT binary patch delta 1184 zcmYL}Ye*DP6vxk*bGICICEXrIMu?GYYFI5SM)s6w>19q7k)K=;mL6Y(ijv$gHW!6< z+v-9ONGxiyAnL==gX)73TOT6L>}_R%OHt4}DCpeT8{J|4zxm&L?wNDv&P?=TQS@R_ zqC*^5a5b9jDlxvFN}gL^(0xk48sK(IK%FO9>dSv6AfJ6-kAQWlQlm1p5zFyVYAim_ozn>DXof%I*Uq*j{h!uQ$-CH;k1Nu){eq$?$&hUs^khvuuK!F2kCe;hyVT z02(4Zz8gy9KrWTH1+9z+pc8_Ye+)oM^BDBcP`-y5a{Ftoh-O^J+1jTyGnzCOUyC`3nWHAwT7ITm088ZA@A-qiI&?^qL{fy_MP8 zqSXNE#fSz0E<;npNtelnTZ#tsIhzaUc4^yhezPA?{%HaIRKhwyjjRu;@vMMB+QRyX zT3Lsvi}f)bXMIBFS)bB%)@Rhm`kX$nzMx85z)K3S4pZQQfLBz<`kL0UzM)pu5!%Q4 zmbzHqk;sh#AQ*g@`>#}!bER6e;JDt-g-5h4Ya{YTOiaN+=V?p?%+w+rCkql{ zfp_$O2#m^&2{G3+-K8Oz@^C_gak>1J5M?;snVJ+s$m{ubPz)mlAV&@z5*0KHY9t;O YL9CI5M?{}_GW(PH8F1Ks!esT>zb9=l7XSbN delta 1175 zcmYL}ZAep57{{M;pEGs3iMq5mqeRiBCTqP2VkIW!degj7MD-yIVWoXYqM*QqWG$t( zwmLx?fl0163WHlvftxRj%+QVCwOOf>Z4m6YJiS@4i%PQj>GnqgN^)~ZVtObIa+aOFDqcTLT5-T zLJ_uyO^2A~u!N6lz(nv8FKw;W&edwnsMWM>nJjE{&DZR+&KEmNsLMVWG+D2B1m2sz z8B*%J6h8$8Vl){GS}OIJ1)v=&b!P%VNbx$1wP!@*>I)D8>{q5nwU< zQ)eZb{Y+Nt9_77?e#sX4!H8OjDO!_cVYTigngbB!fL`S>8Q?Ar_9F$Lh^6WE_PF<_ z10Wm8mz4Pt9>&4@Q}Dtd@=-Aj~%v=TS6C3-}~W5g7;Lzi^0 zgSyqB>WL0^RQD5Q-GJ#&>M^41S3fV_CpQzs2^+SjSL)ph09q+ELZlSouwyB!6kF}M zfn|wyI~FXY9mORi#m-4plXwH=qrjdZFTUa0OH(HvjVuNWc9jTumkDO!tEdqt1p znd10tJ{N#|Fnpx|eb7{Q(`08|zoZ7k#*tKfnbTtH;qVr-Nk_1lbQBv&$FQ-N!#g}p z`W`z-qu5FM0q>EH<1^BaI7Iph$4EcpZ_)`Yk8t>cRiu+xb)Umm+(r5g50QSy4$>bO zCY{1g(rM($J^%)q{G5C0LgT56H?y>%nV0L1VQ)omgJbM=|K@(9+|8fuw7CJ28CX`9 zxJ%r|Tq_@DSuhiB8U(hzR-@OXfxdb4rsj!>vwXhg0-atEb7y((qUXoI7lte|Te>b9 z%OCgrEMt_pscip==0@Re<25T({Nn)?mtEWEU5h^H8`lF}H%7;))xTp_JZR&K*|ag( z##dWKYJjh|PyG+Wl-L{KtE}cV(Y1lN65#c$O3Vd#E?Z_S3GygoZsXTwKFQDp2_hQi dMIzw}U(4Jg{VIQDy&3;+Nm^r&{mFu^#J@!dHiG~F diff --git a/kpclibpy/kpclib/lib/PassXYZ.dll b/kpclibpy/kpclib/lib/PassXYZ.dll old mode 100644 new mode 100755 index 9619b0dbc83553b0c8d3069ff538e6cd74016c15..18002fc399a736ab734260a45d4b84ae0ebf68dd GIT binary patch delta 32974 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 V&weQ!DAks44%&$uzl(Bx{vSO?*4F?4 delta 32204 zcmcJ&cVJZ2_C0>ioy=sCOosH{>yTbaAps&?x-bmT=?}hp~Dv}cXWS$UjN+E29c=o`el|!6Q9+09R2}e=lwJ0&fPZJK%H@=c$ zkiKY(%<>GA>At^iLU980H$4x^O!=1Qb(t==dJfB^wB3k6KRxiP39FbgQi!iU7s61X z=Swl=B?^_{>95@)`>tQDUGR#270sn)ho{Y12ji;kPbqA5orLgBZFtqQ*?XUNUqtYE zXs}1Omqf3>*7q;+?a#jJJ*VwS(XU-weuc`1aQSPVG@pg?=Jl`o4A$h$9=qdj*~?@1 zzX>?PKM6R;KPt2rno13;t<%Jm=Ndv0E8g*NFVAZKNwU}aXlIEv`x^vwJ%xbTg<8$w zW|F4WP)Y3z7BR*342rWtpm^NDVF@iY{tu@O!TukH|wI zGyEvVoNT01bK2t{+7rnR4gHUHRj$7f8m(D0k>&}Eh;rL%HlXEcNL%weY)LyTyfe_9 z0Gbg^#3u?%B50iEii1~1oHn~X0%jy>mU=ee6`bcK9>+FXh(N9Gb-2}6!bfv$gsIiN zi1bp8G$^6^LX@St-XOPPnC?{9CbHYH{3e+tY;GpAl+Cwb`UZ)sVQ5m;yiEmVT<{J| zzaV)vtfIM~90m2DURt>8e`p$=p#&fKzY=t-3@tnr*Jt?AdT-IPzeX}iI*%_KD-vOcK1AyxV z)HFIWn`R@+Tg``Z{1868&ak?K7$lNr7z-_`HXcWS4BxPf;jY#2(Pme8#z)7yUqZOD z^KgZLaI4 z?h};M>;lvmA%|A|Hhf+GMW!{FFkc>C%)khAsP*W&c2k5s0HdoW?8W2SH27k~yTXQzy)IUQkR zzir^{5El-cw%WH*kqc_}!97E%J5AM#O{)7E=RliTh)h$pkEvR3s;)3q_d<35GvkY< z&hg%6sf{#M7n!Q7%v5*n7Bji_xT*TLshVmxORc-9I`KNyZOq-m>tsXSXsYfvRWF*V zfj(xb6}G5!glSqT)h%)>)orS-GF6Y5s)4?yNwA9cy{=h;15KT$o2njDb-k&2$W;B) zZ7Rq5nPuG7R2^rk&NWrn{zFCoZMA#jakB-P1TXts%~|fsJ~WLs&1-oGgS|ns+UaF@PMX--L216 z`OR``b%3cl+f;qhRNZB&{!FTy&Y;&EfPw>?a%-JLiK#l&RGn$6>ZYoDqpAG4sd~{= z4Gl6&xXe@?cD?H6ONaXFWmcazRo^#NkDIFA!Dgu?w^H3Lr=PB^a-Ds-r zH&rhfs{8uc4>8NQ%v2ppMx>U`Q%O^h&0c$ld=%S?6GE;f^E*PE*QO;x{0vm~la)e+aJ z>iW0wI@!4X-C(L7FjX&^s))$b^ z&i9+Dn@!c@rm7{zEQvz5sXWqDoo}kHGFA7Qs+azu^7U_WtXXa&Ox3xj>S|MUuc`WT zYqjP2H$KiRi851lgsEC@s_Lfdex+V_{hJzZmPDPY`n;)n#8mZ3FpJwg!Swp~VN>UA zrm9Rd3tVZc)|;rf{@q|A+iH)Qs?kYi&Gj->XPc_)u2q|^e|KLitLxwIOx3_-vm}a5 z)p4fk;%4=l>)-d9<<^&;KbxwVDP~EGF;$nEs=G-2=k>35s#)MFQ+2wj`jV-7%v5z} zrkOQ2##DXURNZH)dZ(MkExTSdu74+9FZ1>93RCr>saoYSYtC(|zTZl1b^Ytz)+|IX zQ+2+ny3eP7hWewa8klX?T$!m_ZK}?{Ms2?Sec>9p>C$tXse0U0{o7QH%`r>3vPo6f zzjy?66WvlCqG|sk!&2J^9wDw^Au`i4x@oT0@sy|TOI#MY=q@=uG8)+APlly-DEo)7 zKS~ERm6Bnpt-iK&a8v1Ey8f}$&f?G?KFsc6?0%#6FA}eY zMc|e>KSrYDZf>eThNV{L3b?6`&dku}+<-3BQ`*`bH`|n?dKmWjHO1GJY8KbK7>JB_ zUHcKjGSwRo$h>O4f}N#>Wmvo#NpRx1h|{a)094KD`WXJ<8F*Y}5pD6L0}tE+wb{ea zp0CZ%+v4*78gA3N;YpW6``0i}V^LywOW`-ym4$ou6!~^C%ClvLO|#S;f=kU|K*r>{ zBiN+Yu0mg3!_jKZQSgS|Xo^N;1Z`Hs9^~&?1Lvd)I}}K zwUss@u1{%GcMP#yd&qR{2G+ihR>Ju4U1Za^*L({fRQQa%yy}NjgVb#p{A09%z=-cg z?nVQKqgHpE8o0i#x)Y>wz?Np);L+f9_O`wad8?w~UqIGSgbSyP^RBdzNK{wgk zWcuG=T9k1hkhn%AJD?9uB%^3e0EEDrzY-J4VIAbLW@J$b-crM zyz_Ou%XPf#b-dekyu0G=rXKgW&Y{o)8VK&28CE-nx6ax+-eTm+JdG9Q9X(9bYPVU)Ew1)i<-S_EZ&vO*X=|hN<#SEv zOENsCD~7mlHD2sdFDT#)ijzJ)$bUz3ok5COKE^h(Fx+sA;I}yV9S*}$o4ta9;%bWg z!wbD}HfCkG<~mIg9GdHU+TvP*0>5fplHiPa7HXO1dKDYjNq|pN^I z=am%RII-izDR4a%h$dEg>>U!_EfreAWX{lPWqDH|*DFooGjG*uGh6ia&3ZSjc4&+K zTC<*`)w)~sbIipNAApw&X98bW zUqD8bB|iVE%m}lD0a4{AkAJ6<%D=h`kvvC;2|a{ZhI+{Zr`1lJJid;uf9wz7MLqN} zdGJ87^<5$8t*_+ngL`(tb`QAS)7U9J@?NkM{Jw@?yb~tA#l{D}KY6xw3ioLPs}xDy z<~i0W)%^^P3G`zVFT`BTwTZM?!rP*s%xxpa=aGIm+7)jT{;~UAHgQu7;bF$9jBOaR z7~f}nG@5)aM-dLpcn%oaZcwUC1V>Zk%Q0lHl!TAO?02JhPJpWr1v!N4#kXEI@kSUG zZ{-T1l9V+8q+CK;Hj$gX5a`fIDNP%c>MKTMF2ai}HEjo_I>o4r{vB+h2(=y+>6kaC z(8Z^@PVrOaOp8);%4V~cz&2p4Q%$AX~8I_)@e>LGpn}PDF#Q( zv_y%IQ{xMw#H&E3n3J*5^lA}9K*Y@6uH{fo~o%(ICBQC}q6#EfXd z96RA#*@WA8JYM9n+2f*gYclFIj7>b*aB_+zDg8V63jcPCGM(aK*fwz-BjgnGVLQd6VWd2R zIANj?BM~N2+R=E_v*){&l-ypV7$#y-Y7?6SX>3xQRLkS`emKr1UM!;dC`%;QCwa+? zL+(!TWaMCNa$m`y)G%?oi$ZMWG1$jzhE+)TEmhS9K&c(A7?|zKDUPy`m6%4?e%)zvb9! zarc1}li2f0BJR_wU|CQSAl4N2D5w%%!jC=Ai5>+w4nQZ*^I%jKEgJEj=G$?^>>@)* zd{`3RMLi1Yg|8^&!V%e27zBnw@f29Sh!AC90b(FG5vy22IeEs5j$ChY3b7>7jhkN# zCct_zI~``QKJ58HzTw%QnLEFjXr7qJO_X!qPEJ(O$g7{e95cqkWa=Al7jwo((HQCpwAOC3Pu}S!ZGxnH$}yWoW*K zqFuoz;6vpuNdq-EpUOsw16;99F@^DnubK7WFiXM6vpj=5pQADat8_9$Zv>~j~2p=!`(l=jxTktjT6UI%9|6^RtI1gyEJ)-?C zhBUM(IgDB#_ z#$Om0us#sufZ=0&f|c!DdVujP<9ycpvCkS#Xg5bb%J`g}B2-{m8dEiJNJHP`zUcS& z{)9Dggs*rLzHaZ^JbT`jo1i!ukCv0YCXn!o7vb;#!fBC&mqKsy_}!T79)ihuG-DWs zet?~pTw-xwd~C|qbS&L4@h~Rr_9&XRyGt)wZQ^Qv0jBmj`MV&WTQM6&VhnJQm<*gM zX82*J#?KCG&x|>UY5eT4P79a|)<1#xeGvt@0k{@AMJ!m{XMZVvCHDEVL`9?h&3Mn& z8@srVK(vXJL=u;XTZ+a zvq#*^e!FLi4&LKHAw_lvN zOHs-@UVN_@<((+<_?&!7rsS5(B+-%CF=@?>#;LA5vn9e4f5no7s}l;kM0_7_@k$mm z6`Kr}A|7gHS1hTbB+c;r%elwPohAk;`exc5uXIt7PKAqvHSJYDm$+H6Ah5RLF~u^$ zGQ@UfOT?j+O@5ietE~~Vz_P_JOY~N3QpFCxY%xKxRdJvC<%-wv`Gs0|u>32(e7E@B zpb@3H-})7bqAV)B&pt2v6j+5~k7fS|)>W~c6-C$``Y85g#d*IXF@)JEIX3e*zhW`n zDC1>WEb5i#SCxOFY`$XOR!T>)@LcVa;%;B~n_r1|NfmT2v^z?~E3HD5iZ_@o5gXE+ zj#AMs+vvfX>?lWj(M7Qd$tjKwq6bc>)VohA@3vHln-!}}%W-t30{rZ-*0w2hbTJ6A z(l%9&?oHHxWy(s4k3syi!}?))A4dyIN^J1zCAM?WC3d^#K;O)mZ~c0UdAMewx!;;) z@#-y}FqnN^mM5WK)VS}n##{P`_V{1}7yBPs3&A=YOmxjzXz44e63EIM?e=h=SI?kSGJA`DkyluBmkotB}Zn_`_qXE=t5 zQHsq38zH7Cb|rX*W2E?Au@R^@O8lwV_X*=I)gq$Mi1~eSy`x$@#%vKUnA^mk2D87K zKi}8#4`pH!?V8ibKfrBP_)0#{f^s(9Ur=l@x~nxaLH3F0Be{L7a(CW@C8t4J;qcT#x# z?65v+d&Y4m?&0vy4y&}i>}V;Rcn#}p-O#Em-@3(dS987jD4X2O2H8Gx)HJhA_{=o5 znGLk=bF{Ga*27?`{TymrH?!`z?YTgx_IFq>SiAc_*j#wVI>i6sW)^Q7=f9|#Wrpsd-ON69)cY@PX2%`;=VMZbxi0Gxrkv+6bb1RbfE@vF{Wc&S9=7cCwVpg7IxZN;K0!tgT}H%sMJI zF^$RwD;AMT>`ujwWDsjKnA`r0H&I;`?n@`OTCo{8lx`C5DQ1f#c0jS`lZpMT*iT%~ zitn&dYP-2h(TX`L$unQExjcs56?5MmMTH|3J!>OYr`S;*s0E6B!DY`X)}{@4Zcr?n z*~f}q<#9Tu*snYmmlWH|&HLkfZi4V7_pZW+f`2NZN>H%68l`Sc9CwPrxpE!2l#KrF7iBub}*W7CXr{RVqbFF zRf^T-Q`u0(E`|`Bq*ye^oU7QDP%2xh*u0SOZqT)g25VIKzG8cL=^a$8%8Sa*E7s7S zn0H4bwQt)J!}TnWMNts3Ld9ls?|Ult5>L!1#eA^x+?&L7Mcv%QLdBA}iRFrI4WytO z6`RcKd6#1InH^WGC#QW`F)PPx)5%EfMqVYUioKYKm~PQtQ4d!fpjaeV9Ix1r0&2cq zvEjU{c@*2jo+}hvOhLsK#TIoSwokEpa*6$@*h;SFmQ?~jOYDnzVT3C-C7WEc6?>d_ zr_PEM^2iKRY&S328pYyxmCRS{4ervDik;*m%R0qg;M6{FD>{kuKBU+&u6RMQ!JMhj z4Mw7M-1~UNig`aMR%`+9YP}RY%&b~5H}A|d6&uZ6diVyn5wx5OpI3!te7M}C*ac2z zw_B;0-sn|OlWngDM|1Gf(=1eE5LXR;s zij`(j#l?yR^5CyhtSuk&w<-2E@Avx^3+H-g6dTRsWZ^6LCHDSt6f+VG{a<1);}c1) zD(t}(yDDbqqreEoUd^G3Qx*F!kIemwWpmn3D>j`6c)en)i>cmD#bP+-5n^=yYvj4V zs0w{E$$VJYQ^l#-czie*#X6RaJ`=ubMryh${)~{*q`SkVzgqBTrXcS z_w7u(D|(v8Vx(dVxxaOaE#)~}pqSl<(tcL4mE7P4#V#9XL&g5$={=^{GrZO=DHiJH zbDTeaTwG$`!TUk7Vk>#gmMQizul0V4?cudPPO&9Cz_S(mizjW7V*7ZSUQ#TS2mfuw zwi)NY&lQc}W7%oNCUd5LD`s<1e?xm3v;7J8FjKMaJit|oy~1Tf6`RJ*Pf~0TH$PXg z#gTmeTdL^oymPHp>_I+!ysy|yE<32$PaO2TVv#&f-ZvVlP2>Z4tYVqGrxz+#%bn<{ zSd=%P|3)dgk&k-Q6)WUp*+Rt@bJ=pmR`ED(R4k8I!Y;+m@UC`Tv5q`xmlf;BQQGt} z5*rreovlWVc!cn#;mdJxf4$+c9hH3 zxfPwynSP*H2{(91u{+uIf?_*3j87jU(G^@4uUHlDqQ#179Hp0HUVN&mR_somikW@X z`R`vmPY1U9<}=w`;^(!iv5Q@*DE%h z6WvLS&VT1P=n+-8jThoY#fI=g^y_b=wuy%{QL$OPZR$%EgA*?so=eS$Q608{KS zpD(@e0Zg&Gy;sUNMLje3efA&9h|X7q7s>*}o8n2uX0=@@H;d;LThKN@Y!;go8|%z+ zz9qIPR_iPP+pkz?Sef%}aYV7iunu6~D`pAn;(SM(Gnm`%2@iMbhKIgqhI^P#36tmh# zI(LYeo2b2c!X0A|5FdytrpEob55-7k_t{HQ#yUR~;}q+batGLC#kOlxojb)0#Xi?& zg1HrYAa9QIBXPfCi}U7zJ*L=FOw7mP3B^{rF*6^F{~8p1TIl>l*az}hfO(vsiYd+P zN#`E1-(VseL%LVk2a%_d_Ge<+Fk(x@eDCGX&%{@X{gAxe`MD?`PGviMWavuyg}6a6 zXQ(?sd?9)nOXi(SL|R& zfY>kQD7F+U=qqubVr#L2z7mfr_CxGTZs!4^D|#Vz71%Px#+DU{uf-dRjkgo~Ua^1K z&-;BX{xF!ZClrZ;B5(xt(72g%P;@Yu{c_PO&V!Prl zjTmYa^78sdjAAwy&+nIsZ^YQ*;}Lk(M%=B~KBRqE{B1Cw@Y0T8-Xp2O zW3o>>@^l)^r%!1Yao8=QnHtR>7U|54UK|#=%;t(pvDtZ8^j2)7c+YuM3{>nM@uBmW z7}l!Zx1yTa4m-{Ew_<`~&d>mU$4H7h66yVj`gk0Fq?i^?T+ z{|mzztSR@OIP^I5tVwB|P`^}a*viYp%nk^!h}Ssur#}Dmq|$@j{6e56p3EeLqG1L1 zOQo3}lcHfrzs0P3iRbbH0<0#DJ)J|LF9!q!-~|np3WcjLrEp{8D0NzdElNOum#|in zo|a{#Wz=ns;1(AhtqaK2n5}DjNkNk^29$MkW$_fxv5`t^yQwaD-sEiY|Kysnp_p!x zjG>U?-|5$m?r{(r;@oc>U{!iP@3+Dtcw5)K-Xj&{K zG!Co5OMG`tIO@l^R_pwqK`D+VUgbTgqLpnN8Ay?8Q5(y7S}ab8O+EW(xPK~i+@kju z26-dGfrfj3Jk@wABwYxaXITNL<$~}?}VKr4v62}IIXM`bUKL@hcr!e3C0dtyjb>ttid?x@gq?tk^3Sapm5E-m~h>?^)q-t>5pk=^cXJg5I3y zE$BUj-XcGRbb1S6DQX39-2f=`MgbBk2!kiRhtONlTLpvA82*|izd6zyy)T!`wKS~< z@ca0_Zfqvz50R(EhwaA6TU1_mL{68(G&kOoIW5i>EdhSf?pa{GYYFs)g)hjd8oeF@ zyLb)sd(vK$)sj-7et!tv)@~Q{pDU>DX|B~JQIlg;{Dh!`a+bEd^f&3Ar9ECOwbSD1 z_CeY#?P^50c9(L>V5fz}InYlY2i*o0v+ee3?TyB(YxG zt4(P0pmsp}4U>CJdoX{EHVrYiY5(HL)5OuzFQBC49?|BxdDa8vU*SR8d2O!GFF-x{ zsy2_;#Ci0_W;v$qjSI9afE{I#mV(?A3k_X{WrcRNZLy_HuG50FGWk2Moysrs>X&IU5 zWj$|HMl*O@RpwXtS@+7dX+>hM+>jOon;uB+m0L37tp_Y;^T^(bg|=6&E6+#i(%=Ab zz+&M2KJBfWpB^b%`NZBhW<49Bdmv`ViV175dYw(O2wY4!2q<0DFUTfgB^ z{08GU!fPpaW2sDN7b+I9y`1qa_zdz1F%Al0CtiyaQR#%Kl62p zF7kfZ17K?yY{F`wT}OwgCmME& zPvpO$?2+zukoL0lg?t0jSMmcW2Uz(=euWT+IK)wT0i`Eon2%kYo& zhLv-2ypM(@OP%>u&Oqt!az5}c`EU4KVIQGA55-Gc1GH-!-Pky^?Z5zSFPs83$}U7Z z3?)MQ5lSR0G1{+C5;Tb+P1L?X11XvV1DndFE-e~LmX-m`)5_qJ&pt(34=APDKwyP7 z7J4P?owWI|tF+I2-Iz1&RRrpx(Q@dCaCXs$u|MMg#z9}Z-{Vxqm)h!w{TC0sL&C_-vl?7}s0%~G0a1cOANg+?(JcA}`m`p?0e@KtSc@UG>Jz-TcMm@I06?o6=) zn?kV>*j{W0b`~dry+r$f95Ik_gy;c#4C9?*a6lCYt!8XsT*mmkm@D22*vj^MY;VWw z>W|xwvT}@3NJ=Py@woQ6TkHrpt{sGQT%&>p3*j=x6_(@3bSGo77wMfD$1n=3N6ZbV z_9lIsFJYn|VKrkT<8sET5Y`zR8J9C|1GRCTN#fs zijL4d!841)k9+;@m1=#)y3=~Z`ja&Zm%Re-Sx0(C%}jKMi732T8VgLo3!iOeg2=`t zZ#$X7-#mIJewR~-y-vdOjLS>+!cOTxcw_25;6If;*$1JYsyGV#t?~qLQV2z;F8l$w zCWUNA;?KZg?m*g%X55uU_EpB$^YKR(#qh|>zzu1H%c2NxuOOW6L!phJZzYl)pM3?` zF~ZVDh^1u|=jIZ^=pw@VENq7pzS53xeFR~<05@%J<>J$&Wal~v0~sf!ksXstcszsf zId8%P>4f(r5c)4&2?wwlYKda zFdja*`Tt%hkq1}`*U0{Y$D^wk+4I^Ho@z^28bmmo8(YPr<!iCyEEfzfpwPGSuz$hIQg&M0f%G}Kgli0)dpRwelqEdWCEW1m zJWfg6*SEOI(*fkOf+I}jXeU`8#&KqHTkbL*%!hf{zh#`uGc=Y%cVN4c7tSTFJeezZ zub|N3JWbKu%&cTm-sRF^97kunB8&7;PBEJo<2IhMXx7KNx%okH?z!273+g}Vg83F_rE-SzU*^0kk|hb zUaO~g9VBvv5$yCe&*cnW88%)x$^I1jRmOH4)WO)u*qimay!2k;wGzwv9gJtV$w#@B zr?~?TA71}!xWW})8iMEVIUb2fUh^OEV6NeD+RX#_1rOkVI4!}mdw`RUwL5sgAK@9D&GtDC9m~y6;-#0%lQn~b#(7id z&AdKJ%E(^I_F8Vf$cL2kJnWr0^?_VEmhB_dqFa>lpuNd?RdBV7+{_lnJzSc~i|d|X z3iq|0(8|gPRyOcV-y=!?fw7cFv6f?=V0!__Y0v&OtbD|!?$u1X@_g91*v@OahBIy8 zOowvN_t__cN98|GYOE)ZL02AwC46{^E+JiT=&yNU4&nHZvho<)Kd}7~+evP2vYPkr zJf4VG*|u`NcQBsf+3Ltie8%_;E4Ol>U)kq<9+lxdDsOW_^~OHMDZcGv$9dsiZ#wZr zmlJMkOE|;n_D4aduwdXDVG+P2K2uE&qx0L%DX~!YYstW+d2NAfj6k7O`F97Q;Ir8g zuC<h_lSJN(5sGye~$ z;cIUtz%}>+A?}3X(o4hFZ7Wgw8W7j>_$r}>7fq{x8*xddi8n-7;3m->_@?Ly+>DDf zO}r)g0N=(xBch3S!~ozHT()TfPtAba#8BY7xVfc?_uTl)Et=RaMgrf*clk82LsSDl zz_pzw@C*#NQ;Y|Ggs&jtNdVsC*2E{cE2fEEq6YXWUbNQ4Zd}P}Vvm>(+$&}RKNGWn zpW|vz!;_|Z;6AK-4Ns36f%|bSsNso_dp%bb z2eAV9Bfe^=iJvgmnm8lYQbuQSb4?RJW3V-G4#SMkD;Qu+{DPs?#03nhCVs_mYT_aW zQWL*n2sLp@ya)UpqlWv+7%xryfsxY0pBN)e{Dslc#1)K-Caz*cH1Rjaf}R8H14=wK z!<}n+K)7-1S{?-Pl81m+c?4*a$AI4QIM6On0)6CnKwsRs(uAM<5$KR-fd2Alpi`a) zwviWr0rDa+P+kHC$;-fC`6n<$UIB*6zky-+il!#Q@r6sxEh3~9BvN_z9J7)vk*)kWK9GMTym4(1OiMwwiUzPw1WErqfwg(o;N?@_<2y7>-fF-gs zuvB&hmdWnGa@iBuUiJc3$UeYI*$>!34ghwP1A(37U|^LT3cSIMyH%R#EJpyl$dSOV zaul$etOjA1ooDbfPG{Qu&?iAh{pEDv067zQlbi({ zC}#r)$$H>m=>`tL_hL0MRJ!M4bF-We947Av4wnmnBjiHhE%IUDNckx6R=Ef`N_v2! zdaoColU>^hGuq~@$9|z*FE!|^4PRcPLr{p-;-vM#l zmg9k^Zo(amAROllMUwd5k`DaA z(iZrWB@=kok_|j($;G|Hblf5AA?AyhJPYnm51eP+Z#`l4YM_Tg5)To*JlpOMkC3+e z9XQiN;TKfN6u!1anVxg^r@4PEAd2I8s~;~s1S9v>Kk@8mf!d-!k>BJ&T9-Whi(I3O zdh~+&V`B|F8uqdohW$Ie{{A1su7IBCK$c1P+aJloTcmiFKhQn!1~HGb>7uraJeMEn z75{>syxwSc?o2F;o> zPV}xBKX6+0wCQ#0$1IBo@;veC(DlCSPg>R&ZG5@S`inbGYwM5ge9lW2E@>kRJU@Ke zbA9xlrNsdsd>Q4laqNBF-dP|&@3U&;FZyd(8I%6$PZ)>jqj%U1?f;C`6XDv%eJj|^&Dthe`(WpOKl8kSqVWnjZ<1T!$GaUC*uI)fTF=#TqI zSNbL^I$-s&3h9isqJK`rLBsF+P%@1>HD?U^(zsJU<|CuzF8wb&KXD(5@%Gk&8jb}G zLbX^cMnqzRk%$RuJY@IQ0vpZ*Hk{`+&oG|%^Y(HEHCzm8xE$1jGHkf$ggY`l?MSc? zrILoXtqExQ44j*MH6PpV5rWlzX(r zSK2B0%QO-A7)usLJ3-Tealg>d+Y;0mY5eaew4lZ-#{Z50X^9g7arirnal(qhZH&Yi z0x5b-(7jd)8H*vrECr4Q!9)iOUvG@D85-EI4FmJO z(_#x6E#mGH(Xc?`(UCmz-T=t6svRE#*$E6?a3m&YnXgj-muXp zT;ALnEpEdHf$8|0B%^?} z;x4gXACWB6tVd89r5{U`A)bKGZSr1yd9rlL`}LobWrXLB?;UaxnJIE9D|%K6{toBz zNPTL$4EH?sd6;!YB>rY6*Vh|Tq_2EkPfV2&{$tSE6nwaN8^uO=?=jr`dmP7qEIzc{ zh2LrT{ZK!bBJ<=Ps+pi2R>2?pB21ppr>3GW=Mf~&$no44G4c;1x#2%LtoWNiO|3_z z;TeNplzuK*hU=ASSS&$$zjUNB38~CLGf~aHjw$%~RL5;6MCp&FVSS{NZT^OWgv~hVp z-EY6)HMmEOMKaUydmHy?90E>;HHk(Q#WCYRry<)}C@|W?`w*fKkKx*h{Zaan3>oU_ z@Rd!T(ev8MB+Wls&u@!~9sQNB)?V2SU-`<;`cm9}w)TofNc~7#8RprFN`v)-ZPD{v z^urlY5)Rn3JGf3LY=@j>$ekcBiPmefWvE`CAp_)-`Xd?ArL9ofF4Ep0-xzI&Q5}nC z3_3IlI7S@N<1%GC%@(6SmMcSj$6)yD(3N=Pks-sali--4FUmynotmXOF;?H3DYLYD zj9Q*OU)#0&RWa3GO*JC$jpB)DrB2)<-r>SfPp5-6d6){rU^?V+3KQlTeK1V^%Bp@e z3+rFT>Swd?G035J%0clr2c24MEO*g!^{U;>O9LM$Mghs5vIiNDw4QPSwB3lTq5kamKnFeZ;0MG9r8KITB!9g7?2-^wIe^ zQY|}T*OnP+dEPqWlrQOx`H1`)NA~=2#3A1$CBpk2G&@ZkXd<<^4RV2;k~A65z0%7I za60jc=O*=01=6Mk#T(N`#BOvpJYIjW09X7jqv-KtbYwVIfTLBFp?Eq#>Pb?V=hkDs z+5jV<_bjwNM%=8ADa2uHOgtT|wiUwX(_?mdxBfO%`H=oj5tO)Zoz@rFp;M6zaTxn> zEyit4yk1j+-E{P~HXK}s72%MxS-+T8RnQ+`NxirlNm70Xh~6!A3~EpcAs;iK#rvtX>x{ssU5Ow&?8D@7EU4X3iITh48pks zbz|gzji#oY43I1IS4(7)T(9pdkvGau^n_9bJj4M5P8G<%^@dXX>#GTg`m$1dCQD1y zKPbfwhdljCDUQZBBw`#rM^D9B>1EfP$G^*wqx3mtGRyinc$z2gyAaRh?}Fru`rlls)Po|w}S zIOpWG$1W(6^!)ZRSfAJ)d!28RKD)h)wuU4L(LoRFh~BO|?XpIJ_BQAbr`uU`Thlnt zkRKwf{UGHuRdD#%VU}lLZ=Z}?c=PqO6|w^s^w|pZXFD7-$T8{hGj^+YGM@7&7G|9W zRzWO9Ut1|7tj~aVG5EPkOv4X)U|M8~=&w}BNKgNt!t~7@a42}N z$stSsqXYKBmAZdNT*V)Pta8jb6JhN()2b} zxaZVPudI?CwC-toKo_k2t7jwhl~vMV9hZhRsaI9uA4PufXJ0v2Uw#7)LX|hjC_Ui@ zX_HIz^c!RamKQeVmI9nT;LuLHn5H*Soc`xR94&bTrt8kmvb{Aa9Ut!Wz|Jzy<2)ZB zOY}BfWQ2b12I=rzJ?CguVIWrs_pCV|;d$u1LspY#xop(kU8KvOt_db#Dr<32Uqn)o z^>swf(ffA69DUP8`dU8$ztPj-LY61)LV%v$6~q5aD=E$zf;V})u*2C44*zagr?nh& znyA!2?JB!i?}9@G94f3HSRG)c>2tct2>G^txSMq8Te{)E@G05dtjFL{3Xc@MPj?xD zCCnaV>(6vYHnz4#Hb%MU>aRi897yG!z8BLxr58i2?ZG;Lb&$RFdwO6!PKJQ?ddQeo zqw;)P9$Y=PC$6~u=z$BbH+1iwvOxQ+Elp;q-oGc7=W$eZ>AQPkhurgtmf_+bWECaDaP~Zr3g7*Uw0$AJ4fGh zBaVF@Vj-S$zx!HWfm@8{uis;=Z^4R#72$2{U;8%R+)G}t$n6_@_rtwEFMnTuUwu(O znY!_Z{&KRkfNvajlPof8~95$AXk_AmluzqTkOlRgCjpa)9dybZcY}AjI4{6Bl*g&l9 zlxi7jrKbG#_SG_%9qz1_-MIPuoP-fwCy&2tV%-G2<83lV|GFA;;IE&m#{F0Sjp?_^ z>{|*}{v7hGkbU}V0?$A2>o_2V1AooE>4z-5`i^@pLQF&1w9Wc`@5rRA6MyUrsCKUJ z{N#TYqzv1B`6=@2R({LOy1Q0|Ye-jN*(RE_tdRSjzS zr<8^YK-1#1&H~kzUJ7G~`n6~?XK5&a{tIydY6LjZRImZWgcyK!g_uMxw q-iq6WvS{OicX7KJpMSQ!Crg5gnqurhM_`{T+ZebVw-^`YdH+8+d~~z` diff --git a/kpclibpy/kpclib/lib/PassXYZLib.dll b/kpclibpy/kpclib/lib/PassXYZLib.dll index 068db58756c742aa0a40a560e0f4d82f193285ac..59beb8938e3e75f8758eed42366502348268386a 100755 GIT binary patch delta 1550 zcmY+Edr(wW9LK+BFD&fY2fM&76o?Qlkt_;=JRA~Do})aHm!#tITG1%wI+G(oz^oz@ zIk=r{m_{=nf5?>Dv}&fAQ>IR->7=PMVP?s=GttyEIodQAW)Dy+d@Eg|kv+w( ziUFF-#29NxIzS=HD5F=0P`Gj^x)@;UF7UoTN!Q2c9VavbHpyj{UM&E4>Ih9Pquj@^ zZv8OX-61Y>$p0kYlqB|>Ht7K2GH+pf#bNU(J0L17Zgx@}v~)WzPWee|w^AmqPdCa} zM3Oa5G)A0b6J#9{Ly;EtP~5V%TPLR6L&z^eCu(i;HF>YC*&3mHbRdc3IGu=&e3Cgu zeq>eLf07azH{}>2XZrU>CNh04ZLJ*>EINUeia=B@&564_TZfs$ZRMmgFvR zC%TRGigNq>sP~kp>&kWLBwWd{MQ^UY}zpiNUp2FjXc0g ze=51OuDpoW0P(25E;h;7*OsRI&;h({&gBbnS*1awm3; z>P*G;EsTfScnx|q>ect~T0GF`2WhKR57X?R=Z7&~-hd*F8X~=XDY`Y<@38Skcr`le zc#S`g9gpH1+xT)It1p;lU(6_P!lzk5S`cRAEx4gkrEU*zML~8@+iu#!+we}1!pF_~ zc{>hi)SwUO+Hpdq!Pq979_=`-l2@biDv9t@)`JvxKO0JY5k3}nnDB2+JQ8-CNIyp@ zD8h%$0i6f&Dg`gmgH)A*B|OMb$&2aO01xI&X$-4Sq|$A6H%yNXlxcL+o=tR#$PL^! zWZDY}uWRDV(TeN$K{Bke7ZLreQm}jn?yD3m-+_Nr@?sf2;~j{nJ^^^~3cloPkeuWH z#u?8uKQ_)p4bIZMOr2YCjqDd-G_{iNV$%Tmp9uA;_D}2z>c#YoSI{$t5kY5V-gs!tnPzSy$-s#v~a(*EqN-RHq7s;MPm4ZQ*CjsdZvDJFCY zb;BiMV^gvt=dt16@9K{iZ$94@==;s^k#d@nx#DP3!)#4*p3x*qx9AJm^+!tG$$RYy zzx40cS}H~0gkmT9k{s0W>Q{COi+i4VQmLzrNzv%eG8m}!Dqm_4+uf~fvG~)S%u>a) p=2LX&o6Ubo*$5ZkwWLWikuO49b7^-$>p9)!XZ*IdUzsl>>|ZhnZ(RTY delta 1464 zcmZXUe@vBC7{|Zoz1#~N?!DX>?ym_L>>`T%kRO+DP80JYI{BePx{w6-axcirCA_w1 zf`i*7Ad&QTw5YXZ=$hop>DB(IKak}h7pt)-Yha6IMx&-~Zr04L^ZpoH>ul$Fp3nK7 z=bW>1-uLO7A$>FC=py&%I6Mr{BQbdi(vQp`wpu3tGqz0F zak1=w6X!+0WqDEVhTBblP}N$G?nvwxCZ#KqFBrQFtA z^T-x9U>!0O0Uhg3@MGkebW#;dwFOB73)#vXgIqXtlMA^9DZ=CR(g(6-o9#|^&z7?O z5+|CIB_%6Rdsg#Y{ zHdZo8OP7L7$I_X|G3uSr>3wn{(!lThqLl51DYa0Em8__+3IgKtm z!qf|6k(%dC3e$Q#twpjf4Cu_A53 z8I7uiF&aROTh&e*$7m33D#b0B&eK+OY2-C539Se#G~jF!4QR!%LSc=VLM(2=@(ItI za6{go#f`^a;W(vbBb`M4NgXxqy1eNBAXDo_1TrT7Cj52vU?>h|rJP)Oar9n%Vh zu^*GP9k(^=#tr&BmP?{EE0q>bCFG+Pv)t}iYygWqegSr40AYBIA#~$&eOQTqA>YE! zyagLbMs%=XyN(F#tKv1>-Y-rjF;TsHYE|@ZwN0?BbDv$x$_!PW%KrV0HQANlN3DCm zNRU4TN}w;yFUl`sKQzv<3(x&&n}3vj0iRBlF`rt?KbC z9FpVoNQRyG*;w;IwkJ@@%)Y1iOUkO+mRN(YI9}itQjjYnJM9aQo$PO)i)6Ai{{$&w kxBQQE1^jUHEjf$^p5!B9@OpfQT7LVtM8)7;5-EuN7vdFN`v3p{ diff --git a/kpclibpy/unit_test.ipynb b/kpclibpy/unit_test.ipynb index f054277..5e2270e 100644 --- a/kpclibpy/unit_test.ipynb +++ b/kpclibpy/unit_test.ipynb @@ -75,45 +75,47 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 1, "id": "metallic-survey", "metadata": {}, "outputs": [ { - "ename": "KeyError", - "evalue": "1", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mentries\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfind\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"README\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mentries\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 1" + "name": "stdout", + "output_type": "stream", + "text": [ + "['/home/roger_ye/KPCLibPy/kpclibpy', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '', '/home/roger_ye/.local/lib/python3.7/site-packages', '/usr/local/lib/python3.7/dist-packages', '/usr/lib/python3/dist-packages', '/usr/local/lib/python3.7/dist-packages/IPython/extensions', '/home/roger_ye/.ipython', '/home/roger_ye/KPCLibPy/kpclibpy/..']\n" ] } ], "source": [ - "entries = kp.find(\"README\")\n", - "entries[1]\n" + "import sys\n", + "import os\n", + "path = os.getcwd()\n", + "sys.path.append(path+\"/..\")\n", + "import kpclibpy\n", + "print(sys.path)" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 4, "id": "thermal-british", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Index\n", - "README\n" - ] - } - ], + "outputs": [], + "source": [ + "import kpclibpy.kpclib\n", + "import PassXYZ" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "local-constant", + "metadata": {}, + "outputs": [], "source": [ - "for entry in entries:\n", - " print(entries[entry].Name)" + "from PassXYZ.Services import PxKeyProvider\n", + "#print(PassXYZ.Services.PxKeyProvider.Version)" ] }, { @@ -538,9 +540,9 @@ ], "metadata": { "kernelspec": { - "display_name": "kpclib", + "display_name": "Python 3", "language": "python", - "name": "kpclib" + "name": "python3" }, "language_info": { "codemirror_mode": { From 61e90075db0e6b32de8e406a74e06cbd08db95e7 Mon Sep 17 00:00:00 2001 From: Roger Ye Date: Sat, 17 Apr 2021 19:02:08 +0800 Subject: [PATCH 3/3] Updated README.rst --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 6a7fb11..4c423fd 100755 --- a/README.rst +++ b/README.rst @@ -73,7 +73,8 @@ Configuration ------------- The default location for database files is at $HOME/.kpclibdb (or %USERPROFILE%\.kpclibdb on Windows). To change the default location, a configuration file kpclibpy.ini can be created in the folder $HOME/.kpclibdb. -:: +.. code:: + [DEFAULT] homepath = {your data path}