Python: Modules and Imports - grizlupo/_ GitHub Wiki
์ด ๊ธ์ Modules and Imports๋ฅผ ๋ฐ๋ผํด ๋ณด๋ฉด์ ๋ฐฐ์ฐ๊ฒ ๋ ๋ด์ฉ์ ์์ฝํ๋ ค๋ ์๋๋ก ์์ฑ๋ ๊ฒ์ด๋ค.
ํ์ด์ฌ์ด importํ ๋ชจ๋ ๋ชจ๋์ sys.modules์ ์๋ค. ๋ชจ๋์ ์ด๋ฆ์ผ๋ก ๋ชจ๋์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ ์ ์๋ ์ฌ์ ์ด๋ค.
๋ฐ๋ก ๋ฐฐํฌํ์ง ์์๋ ๋๋ ์์ฒด์ ํฌํจ๋ ๋ชจ๋๋ค์ด ์๋ค. sys.builtin_module_names์ ๊ทธ๋ฐ ๋ชจ๋๋ค์ ๋ชฉ๋ก์ด๋ค. ๋ ๋ฆฝ๋ ํ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์์ง ์์ ๊ฒ์ด๊ณ , ์ด๊ฒ๋ค๋ ์ฌ์ฉํ ๋๋ import ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
sys.path๋ ํ์ด์ฌ์ด ๋ชจ๋์ ์ฐพ๋ ๋๋ ํ ๋ฆฌ์ ๋ชฉ๋ก์ด๋ค. ํ์ด์ฌ์ ์ด ๋ชฉ๋ก์ ์๋ ๋๋ ํ ๋ฆฌ์์๋ง ๋ชจ๋์ ์ฐพ๋๋ค. PYTHONPATH ํ๊ฒฝ๋ณ์์ ์ง์ ๋ ๋๋ ํ ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋ฐ์๋๋ค. append๋ insert๋ก ๋๋ ํ ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด ์ดํ์ import์ ๋ฐ๋ก ๋ฐ์์ด ๋๋ค.
๊ด๋ จํด์ ์ฌ๋ฐ๋ ์์ ๊ฐ ํฌํจ๋์ด ์๋ค.
# sys_path_modify.py
import imp
import os
import sys
base_dir = os.path.dirname(__file__) or '.'
print('Base directory:', base_dir)
# Insert the package_dir_a directory at the front of the path.
package_dir_a = os.path.join(base_dir, 'package_dir_a')
sys.path.insert(0, package_dir_a)
# Import the example module
import example
print('Imported example from:', example.__file__)
print('\t', example.DATA)
# Make package_dir_b the first directory in the search path
package_dir_b = os.path.join(base_dir, 'package_dir_b')
sys.path.insert(0, package_dir_b)
# Reload the module to get the other version
imp.reload(example)
print('Reloaded example from:', example.__file__)
print('\t', example.DATA)
๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
$ python3 sys_path_modify.py
Base directory: .
Imported example from: ./package_dir_a/example.py
This is example A
Reloaded example from: ./package_dir_b/example.py
This is example B
๊ฐ์ ์ด๋ฆ์ ๋ชจ๋์ importํ์ง๋ง ๊ฒ์ ๊ฒฝ๋ก๊ฐ ๋ฌ๋ผ์ง๋ฉด์ ์ ํ ๋ค๋ฅธ ํ์ผ์ importํ๊ณ ์๋ ๋ชจ์ต๋๋ค.
๊ฒฝ๋ก๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๋ฐฉ๋ฒ๋ง์ผ๋ก๋ ํ์ด์ฌ์ import ๊ณผ์ ์ ๋ผ์ด๋ค ์ ์์ง๋ง, ์ข ๋ ์ ๊ทน์ ์ธ ๋ฐฉ๋ฒ๋ค๋ ์๋ค.
sys.path_hooks๊ณผ ๊ด๋ จํด์ ์ด๋ฐ ์์๊ฐ ์ ์๋์ด ์๋ค.
# sys_path_hooks_noisy.py
import sys
class NoisyImportFinder:
PATH_TRIGGER = 'NoisyImportFinder_PATH_TRIGGER'
def __init__(self, path_entry):
print('Checking {}:'.format(path_entry), end=' ')
if path_entry != self.PATH_TRIGGER:
print('wrong finder')
raise ImportError()
else:
print('works')
return
def find_module(self, fullname, path=None):
print('Looking for {!r}'.format(fullname))
return None
sys.path_hooks.append(NoisyImportFinder)
for hook in sys.path_hooks:
print('Path hook: {}'.format(hook))
sys.path.insert(0, NoisyImportFinder.PATH_TRIGGER)
try:
print('importing target_module')
import target_module
except Exception as e:
print('Import failed:', e)
๊ฒฐ๊ณผ๋
$ python3 sys_path_hooks_noisy.py
Path hook: <class 'zipimport.zipimporter'>
Path hook: <function FileFinder.path_hook.<locals>.path_hook_for_FileFinder at 0x100734950>
Path hook: <class '__main__.NoisyImportFinder'>
importing target_module
Checking NoisyImportFinder_PATH_TRIGGER: works
Looking for 'target_module'
Import failed: No module named 'target_module'