Python: Modules and Imports - grizlupo/_ GitHub Wiki

์ด ๊ธ€์€ Modules and Imports๋ฅผ ๋”ฐ๋ผํ•ด ๋ณด๋ฉด์„œ ๋ฐฐ์šฐ๊ฒŒ ๋œ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๋ ค๋Š” ์˜๋„๋ก ์ž‘์„ฑ๋œ ๊ฒƒ์ด๋‹ค.

Imported Modules

ํŒŒ์ด์ฌ์ด importํ•œ ๋ชจ๋“  ๋ชจ๋“ˆ์€ sys.modules์— ์žˆ๋‹ค. ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์œผ๋กœ ๋ชจ๋“ˆ์˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ „์ด๋‹ค.

Built-in Modules

๋”ฐ๋กœ ๋ฐฐํฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ž์ฒด์— ํฌํ•จ๋œ ๋ชจ๋“ˆ๋“ค์ด ์žˆ๋‹ค. sys.builtin_module_names์€ ๊ทธ๋Ÿฐ ๋ชจ๋“ˆ๋“ค์˜ ๋ชฉ๋ก์ด๋‹ค. ๋…๋ฆฝ๋œ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒƒ์ด๊ณ , ์ด๊ฒƒ๋“ค๋„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” import ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

Import Path

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ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ์Šต๋‹ˆ๋‹ค.

Custom Importers

๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฐฉ๋ฒ•๋งŒ์œผ๋กœ๋„ ํŒŒ์ด์ฌ์˜ 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'

Importing from a Shelve

โš ๏ธ **GitHub.com Fallback** โš ๏ธ