Skip to main content

importing a module by physical file path

Project description

magicalimport

PyPI version Build Status

magicalimport is a Python library that provides a flexible way to import modules and symbols directly from their physical file paths.

Motivation

In some cases, you might want to import a Python module that is not part of a standard package or is not located in Python's sys.path. For example:

  • Loading a plugin from a user-specified path.
  • Using a Python script as a configuration file.
  • Dynamically loading modules in a script or a tool.

Standard import mechanisms can be cumbersome in these scenarios. magicalimport simplifies this by allowing you to import modules directly using their file paths.

A key feature of this library is its special handling of .py files. The import_module function can distinguish between a regular module path (like my_package.my_module) and a direct file path (like ./path/to/my_module.py), providing a unified interface for both.

Installation

You can install magicalimport using pip:

pip install magicalimport

Basic Usage

Let's say you have the following directory structure:

.
├── my_app
│   └── main.py
└── external_module
    └── helper.py

And helper.py contains:

# external_module/helper.py
def greet(name):
    return f"Hello, {name}!"

From main.py, you can import helper.py like this:

# my_app/main.py
import os
from magicalimport import import_from_physical_path

# Assuming the script is run from the project root
helper_path = os.path.abspath("../external_module/helper.py")
helper = import_from_physical_path(helper_path)

print(helper.greet("world"))
# => Hello, world!

Special Handling of .py Files

The import_module function is a convenient wrapper that combines Python's standard importlib.import_module with import_from_physical_path. It automatically detects whether the provided path is a file path ending in .py or a regular module path.

from magicalimport import import_module

# Imports a regular module
http_client = import_module("http.client")
print(http_client.HTTPConnection)

# Imports a .py file directly
helper = import_module("./external_module/helper.py")
print(helper.greet("again"))

This allows you to use the same function for both types of imports, simplifying your code.

Importing Symbols

You can also import a specific symbol (a class, function, or variable) from a module using import_symbol. The symbol is specified using a string in the format path/to/module.py:symbol_name.

from magicalimport import import_symbol

# Import the 'greet' function directly
greet_func = import_symbol("./external_module/helper.py:greet")

print(greet_func("from symbol"))
# => Hello, from symbol!

# You can also import from standard libraries
HTTPConnection = import_symbol("http.client:HTTPConnection")
print(HTTPConnection)

API Reference

import_from_physical_path(path, as_=None, here=None, cwd=True)

  • path (str): The relative or absolute path to the .py file.
  • as_ (str, optional): The name for the module in sys.modules. If not provided, a name is generated from the file path.
  • here (str, optional): The base directory to resolve relative paths. If None, it's determined from the caller's file (__file__) or the current working directory.
  • cwd (bool): If True and here is None, the current working directory is used as the base.

import_module(module_path, here=None, cwd=True)

  • module_path (str): A module path (e.g., my_package.my_module) or a file path (e.g., ./my_module.py).
  • here, cwd: Same as in import_from_physical_path.

import_symbol(sym, here=None, sep=":")

  • sym (str): The string representing the symbol to import, in the format <module_path>:<symbol_name>.
  • here: Same as above.
  • sep (str): The separator between the module path and the symbol name.

expose_all_members(module)

  • Imports all members (that don't start with _) from the given module into the caller's global scope, similar to from module import *.

expose_members(module, members)

  • Imports specified members from the given module into the caller's global scope.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

magicalimport-0.9.2.tar.gz (6.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

magicalimport-0.9.2-py3-none-any.whl (7.2 kB view details)

Uploaded Python 3

File details

Details for the file magicalimport-0.9.2.tar.gz.

File metadata

  • Download URL: magicalimport-0.9.2.tar.gz
  • Upload date:
  • Size: 6.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.28.1

File hashes

Hashes for magicalimport-0.9.2.tar.gz
Algorithm Hash digest
SHA256 fcdc657196db955684d65e0a40b88c036f0bca4ee8a48100e4fe2ad78252db80
MD5 9fbc7b7c798d140c4d5d34c9ad1f820f
BLAKE2b-256 b8108e4ff6e0829283de50458a3e4a137fe218777627077e641b32d2ba74f765

See more details on using hashes here.

File details

Details for the file magicalimport-0.9.2-py3-none-any.whl.

File metadata

File hashes

Hashes for magicalimport-0.9.2-py3-none-any.whl
Algorithm Hash digest
SHA256 08a326ece05932caaf9be8eae865a42e85afda1c2642411063ab816a8872f0b2
MD5 db8278a9d0cd1e2c8ac4ce4129264570
BLAKE2b-256 f805a2a8f0ae1cbcfe6cece7edcc2b48d9e14023c797ea4ae8581eae85d1540a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page