importlib
මොඩියුලය මත පදනම්ව මම මගේම ගෝලීය සහ අතේ ගෙන යා හැකි ආනයන ශ්රිතයක් ලියා ඇත:
- මොඩියුලය දෙකම උප මොඩියුලයක් ලෙස ආනයනය කිරීමට සහ මොඩියුලයක අන්තර්ගතය මව් මොඩියුලයකට ආනයනය කිරීමට (හෝ මව් මොඩියුලයක් නොමැති නම් ගෝලීයයකට).
- ගොනු නාමයක කාල අක්ෂර සහිත මොඩියුල ආයාත කිරීමට හැකි වීම.
- ඕනෑම දිගුවක් සමඟ මොඩියුල ආනයනය කිරීමට හැකි වීම.
- පෙරනිමියෙන් දිගුවක් නොමැතිව ගොනු නාමයක් වෙනුවට උප මොඩියුලයක් සඳහා ස්වාධීන නමක් භාවිතා කිරීමට හැකි වීම.
- පෙර ආනයනය කරන ලද මොඩියුලය මත පදනම්ව ආනයන ඇණවුම නිර්වචනය කිරීමට හැකි වනු ඇත
sys.path
.
උදාහරණ නාමාවලි ව්යුහය:
<root>
|
+- test.py
|
+- testlib.py
|
+- /std1
| |
| +- testlib.std1.py
|
+- /std2
| |
| +- testlib.std2.py
|
+- /std3
|
+- testlib.std3.py
ඇතුළත් කිරීමේ යැපීම සහ පිළිවෙල:
test.py
-> testlib.py
-> testlib.std1.py
-> testlib.std2.py
-> testlib.std3.py
ක්රියාත්මක කිරීම:
නවතම වෙනස්කම් ගබඩාව: https://sourceforge.net/p/tacklelib/tacklelib/HEAD/tree/trunk/python/tacklelib/tacklelib.py
test.py :
import os, sys, inspect, copy
SOURCE_FILE = os.path.abspath(inspect.getsourcefile(lambda:0)).replace('\\','/')
SOURCE_DIR = os.path.dirname(SOURCE_FILE)
print("test::SOURCE_FILE: ", SOURCE_FILE)
# portable import to the global space
sys.path.append(TACKLELIB_ROOT) # TACKLELIB_ROOT - path to the library directory
import tacklelib as tkl
tkl.tkl_init(tkl)
# cleanup
del tkl # must be instead of `tkl = None`, otherwise the variable would be still persist
sys.path.pop()
tkl_import_module(SOURCE_DIR, 'testlib.py')
print(globals().keys())
testlib.base_test()
testlib.testlib_std1.std1_test()
testlib.testlib_std1.testlib_std2.std2_test()
#testlib.testlib.std3.std3_test() # does not reachable directly ...
getattr(globals()['testlib'], 'testlib.std3').std3_test() # ... but reachable through the `globals` + `getattr`
tkl_import_module(SOURCE_DIR, 'testlib.py', '.')
print(globals().keys())
base_test()
testlib_std1.std1_test()
testlib_std1.testlib_std2.std2_test()
#testlib.std3.std3_test() # does not reachable directly ...
globals()['testlib.std3'].std3_test() # ... but reachable through the `globals` + `getattr`
testlib.py :
# optional for 3.4.x and higher
#import os, inspect
#
#SOURCE_FILE = os.path.abspath(inspect.getsourcefile(lambda:0)).replace('\\','/')
#SOURCE_DIR = os.path.dirname(SOURCE_FILE)
print("1 testlib::SOURCE_FILE: ", SOURCE_FILE)
tkl_import_module(SOURCE_DIR + '/std1', 'testlib.std1.py', 'testlib_std1')
# SOURCE_DIR is restored here
print("2 testlib::SOURCE_FILE: ", SOURCE_FILE)
tkl_import_module(SOURCE_DIR + '/std3', 'testlib.std3.py')
print("3 testlib::SOURCE_FILE: ", SOURCE_FILE)
def base_test():
print('base_test')
testlib.std1.py :
# optional for 3.4.x and higher
#import os, inspect
#
#SOURCE_FILE = os.path.abspath(inspect.getsourcefile(lambda:0)).replace('\\','/')
#SOURCE_DIR = os.path.dirname(SOURCE_FILE)
print("testlib.std1::SOURCE_FILE: ", SOURCE_FILE)
tkl_import_module(SOURCE_DIR + '/../std2', 'testlib.std2.py', 'testlib_std2')
def std1_test():
print('std1_test')
testlib.std2.py :
# optional for 3.4.x and higher
#import os, inspect
#
#SOURCE_FILE = os.path.abspath(inspect.getsourcefile(lambda:0)).replace('\\','/')
#SOURCE_DIR = os.path.dirname(SOURCE_FILE)
print("testlib.std2::SOURCE_FILE: ", SOURCE_FILE)
def std2_test():
print('std2_test')
testlib.std3.py :
# optional for 3.4.x and higher
#import os, inspect
#
#SOURCE_FILE = os.path.abspath(inspect.getsourcefile(lambda:0)).replace('\\','/')
#SOURCE_DIR = os.path.dirname(SOURCE_FILE)
print("testlib.std3::SOURCE_FILE: ", SOURCE_FILE)
def std3_test():
print('std3_test')
ප්රතිදානය ( 3.7.4
):
test::SOURCE_FILE: <root>/test01/test.py
import : <root>/test01/testlib.py as testlib -> []
1 testlib::SOURCE_FILE: <root>/test01/testlib.py
import : <root>/test01/std1/testlib.std1.py as testlib_std1 -> ['testlib']
import : <root>/test01/std1/../std2/testlib.std2.py as testlib_std2 -> ['testlib', 'testlib_std1']
testlib.std2::SOURCE_FILE: <root>/test01/std1/../std2/testlib.std2.py
2 testlib::SOURCE_FILE: <root>/test01/testlib.py
import : <root>/test01/std3/testlib.std3.py as testlib.std3 -> ['testlib']
testlib.std3::SOURCE_FILE: <root>/test01/std3/testlib.std3.py
3 testlib::SOURCE_FILE: <root>/test01/testlib.py
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'os', 'sys', 'inspect', 'copy', 'SOURCE_FILE', 'SOURCE_DIR', 'TackleGlobalImportModuleState', 'tkl_membercopy', 'tkl_merge_module', 'tkl_get_parent_imported_module_state', 'tkl_declare_global', 'tkl_import_module', 'TackleSourceModuleState', 'tkl_source_module', 'TackleLocalImportModuleState', 'testlib'])
base_test
std1_test
std2_test
std3_test
import : <root>/test01/testlib.py as . -> []
1 testlib::SOURCE_FILE: <root>/test01/testlib.py
import : <root>/test01/std1/testlib.std1.py as testlib_std1 -> ['testlib']
import : <root>/test01/std1/../std2/testlib.std2.py as testlib_std2 -> ['testlib', 'testlib_std1']
testlib.std2::SOURCE_FILE: <root>/test01/std1/../std2/testlib.std2.py
2 testlib::SOURCE_FILE: <root>/test01/testlib.py
import : <root>/test01/std3/testlib.std3.py as testlib.std3 -> ['testlib']
testlib.std3::SOURCE_FILE: <root>/test01/std3/testlib.std3.py
3 testlib::SOURCE_FILE: <root>/test01/testlib.py
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'os', 'sys', 'inspect', 'copy', 'SOURCE_FILE', 'SOURCE_DIR', 'TackleGlobalImportModuleState', 'tkl_membercopy', 'tkl_merge_module', 'tkl_get_parent_imported_module_state', 'tkl_declare_global', 'tkl_import_module', 'TackleSourceModuleState', 'tkl_source_module', 'TackleLocalImportModuleState', 'testlib', 'testlib_std1', 'testlib.std3', 'base_test'])
base_test
std1_test
std2_test
std3_test
Python පරීක්ෂා 3.7.4
, 3.2.5
,2.7.16
වාසි :
- මොඩියුලය දෙකම උප මොඩියුලයක් ලෙස ආනයනය කළ හැකි අතර මොඩියුලයක අන්තර්ගතය මව් මොඩියුලයකට ආනයනය කළ හැකිය (නැතහොත් මව් මොඩියුලයක් නොමැති නම් ගෝලීයව).
- ගොනු නාමයකින් කාල පරිච්ඡේද සහිත මොඩියුල ආයාත කළ හැකිය.
- ඕනෑම දිගු මොඩියුලයකින් ඕනෑම දිගු මොඩියුලයක් ආයාත කළ හැකිය.
- (උදාහරණයක් ලෙස, දීර්ඝ තොරව වෙනුවට ගොනු නාමය ක submodule සඳහා නවීන නාමයක් භාවිතා කළ හැක පෙරනිමියෙන් වන
testlib.std.py
ලෙස testlib
, testlib.blabla.py
ලෙසtestlib_blabla
හා එසේ මත).
- A මත රඳා නොපවතී
sys.path
හෝ සෙවුම් මාර්ග ගබඩාවක් .
- ඇමතුම් වැනි
SOURCE_FILE
සහ SOURCE_DIR
අතර ගෝලීය විචල්යයන් සුරැකීමට / ප්රතිස්ථාපනය කිරීමට අවශ්ය නොවේtkl_import_module
.
- [සඳහා
3.4.x
සහ ඊට වැඩි] මොඩියුලයේ නාම අවකාශයන් කැදැලි tkl_import_module
ඇමතුම් වල මිශ්ර කළ හැකිය (උදා: named->local->named
හෝlocal->named->local
එසේ ය).
- [සඳහා
3.4.x
සහ ඊට වැඩි] tkl_import_module
( tkl_declare_global
ශ්රිතය හරහා ) ආනයනය කරන ලද සියලුම ළමා මොඩියුල වෙත ප්රකාශයට පත් කරන ලද ගෝලීය විචල්යයන් / කාර්යයන් / පන්ති ස්වයංක්රීයව අපනයනය කළ හැකිද?
අවාසි :
- [සඳහා
3.3.x
සහ පහළ] (කේත අනුපිටපත්) tkl_import_module
කැඳවන සියලුම මොඩියුලවල ප්රකාශ කිරීමට අවශ්ය වේtkl_import_module
1,2 යාවත්කාලීන කරන්න (සඳහා3.4.x
සහ ඊට වැඩි):
පයිතන් 3.4 සහ ඊට වැඩි tkl_import_module
සෑම ප්රකාශයකින්ම එක් එක් මොඩියුලයේ ප්රකාශ කිරීමේ අවශ්යතාවය මඟ හැරිය හැකtkl_import_module
ඉහළ මට්ටමේ මොඩියුලයකින් අතර, එම ක්රියාව මඟින් සියලුම ළමුන්ගේ මොඩියුලයන් එකම ඇමතුමකින් එන්නත් කරනු ඇත (එය එක්තරා ආකාරයක ස්වයං යෙදවුම් ආනයනයකි).
යාවත්කාලීන 3 :
ආනයනය කිරීමේදී ආධාරක ක්රියාත්මක කිරීමේ ආරක්ෂකයා සමඟ tkl_source_module
ඇනලොග් ලෙස ඇනලොග් ලෙස එකතු කරන ලදි source
(ආනයනය වෙනුවට මොඩියුලය ඒකාබද්ධ කිරීම හරහා ක්රියාත්මක වේ).
යාවත්කාලීන 4 :
tkl_declare_global
ළමා මොඩියුලයක කොටසක් නොවන නිසා මොඩියුලය ගෝලීය විචල්යයක් නොපෙනෙන සියලුම ළමා මොඩියුල සඳහා මොඩියුලයක් ගෝලීය විචල්යයක් ස්වයංක්රීයව අපනයනය කිරීම සඳහා එකතු කරන ලදි .
යාවත්කාලීන 5 :
සියලුම කාර්යයන් ටැක්ලිබ් පුස්තකාලයට මාරු වී ඇත, ඉහත සබැඳිය බලන්න.