Why not being able to call modules from lib folder into test folder although I have __init__.py file both?
Arup Rakshit
ar at zeit.io
Fri Apr 26 07:48:17 EDT 2019
On 26/04/19 11:14 AM, dieter wrote:
> Arup Rakshit <ar at zeit.io> writes:
>> I am not able to call modules from lib folder in my test folder, but outside of tests folder I can access them. How should I fix this?
>>
>> Mocks$ tree .
>> .
>> ├── lib
>> │ ├── __init__.py
>> │ ├── __pycache__
>> │ │ ├── __init__.cpython-37.pyc
>> │ │ └── product.cpython-37.pyc
>> │ └── product.py
>> └── tests
>> ├── __init__.py
>> └── product_test.py
>>
>> 3 directories, 6 files
>> Mocks$ python3
>> ...
>>>>> from lib.product import ProductionKlass
>> ...
>>>>> ProductionKlass()
>> <lib.product.ProductionKlass object at 0x10d5f2128>
>> ...
>> Mocks$ python3 tests/product_test.py
>> Traceback (most recent call last):
>> File "tests/product_test.py", line 4, in <module>
>> from lib.product import ProductionKlass
>> ModuleNotFoundError: No module named 'lib'
> Python's import is controlled by "sys.path" -- typically a sequence of
> folders where Python should look for modules/packages to import.
>
> When you start a Python script, it puts the folder containing
> the script automatically on "sys.path" (to facilitate imports
> by this script). When you start Python interactively, it puts
> the current working directory on "sys.path".
>
> These differences explain your observations.
> In the first case, "lib" can be imported because
> the current working directory has been put on "sys.path".
> In the second case, "lib" cannot be imported because the subfolder
> "tests" has been put on "sys.path" (not the current working directory
> itself).
>
>
> A modern approach to avoid such situations looks like:
>
> * make your project into a package
> (see "https://packaging.python.org/")
>
> * use either package relative imports or absolute imports with
> the package as prefix to access modules in your package
>
> * install your package into a Python installation
> (use "virtualenv" to get a light weight local Python installation,
> if necessary)
>
> * have tiny script wrappers for scripts in your package.
> Packageing tools (such as "setuptools"
> --> "https://setuptools.readthedocs.io/en/latest/")
> can create thoses wrappers for you on installation.
>
Thanks for explaining this. I read this and couple of internet blogs on
this, one of them is https://alex.dzyoba.com/blog/python-import/ . I get it.
--
Thanks,
Arup Rakshit
More information about the Python-list
mailing list