簡體   English   中英

從不同文件夾導入模塊

[英]Importing modules from different folders

我正在按照 pytest“入門”指南進行操作,但我無法使其正常工作。 好像是很初級的東西,就是找不到。 問題在於從其他文件夾導入模塊,雖然我按照官方文檔進行操作,但我無法使其工作

根據PyPa官方文檔,我組裝了以下文件結構:

(lpthw) ex47_pypa> tree
.
├── dist
│   ├── example_package_vcmota-0.0.1-py3-none-any.whl
│   └── example_package_vcmota-0.0.1.tar.gz
├── LICENSE
├── pyproject.toml
├── README.md
├── src
│   └── example_package_VCMota
│       ├── example.py
│       └── __init__.py
└── tests
    └── test_example.py

4 directories, 8 files
(lpthw) ex47_pypa> cat src/example_package_VCMota/example.py
def add_one(number):
    return number+1
(lpthw) ex47_pypa> cat tests/test_example.py
# import example
# import example_package_VCMota
# from src/example_package_VCMota import example
# from src import example_package_VCMota/example
# import src
# import importlib

# from src.example_package_VCMota.example import add_one

from ..src.example import add_one

def test_dif():
    assert add_one(2) == 9
(lpthw) ex47_pypa>

在我看來,這pytest頁中的所有內容都可以實現,只是它不起作用:

(lpthw) ex47_pypa> pytest
=============================================================================================== test session starts ================================================================================================
platform linux -- Python 3.10.8, pytest-7.1.3, pluggy-1.0.0
rootdir: /archive/MyBooks/LearnPython3TheHardWay/mypython/projects/ex47_pypa
collected 0 items / 1 error

====================================================================================================== ERRORS ======================================================================================================
______________________________________________________________________________________ ERROR collecting tests/test_example.py ______________________________________________________________________________________
ImportError while importing test module '/archive/MyBooks/LearnPython3TheHardWay/mypython/projects/ex47_pypa/tests/test_example.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.10/importlib/__init__.py:126: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests/test_example.py:8: in <module>
    from example_package_VCMota.example import add_one
E   ModuleNotFoundError: No module named 'example_package_VCMota'
============================================================================================= short test summary info ==============================================================================================
ERROR tests/test_example.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
================================================================================================= 1 error in 0.05s =================================================================================================
(lpthw) ex47_pypa>

錯誤是由於我如何在 example.p 中調用 function add_one,並且正如您在 test_example.py 中看到的那樣,我已經嘗試了所有可以想象的調用此 function 的方式。

我唯一確定的是錯誤與pytest無關:我組裝了另一個文件結構:


teste> tree
.
├── src
│   ├── example.py
│   └── __init__.py
└── tests
    └── test_example.py

2 directories, 3 files
teste> cd tests/
tests> cat test_example.py
# import example
# import example_package_VCMota
# from src/example_package_VCMota import example
# from src import example_package_VCMota/example
# import src
# import importlib

# from src.example_package_VCMota.example import add_one

from ..src.example import add_one


def test_dif():
    assert add_one(2) == 9
tests>

但它仍然不起作用:

tests>python test_example.py
Traceback (most recent call last):
  File "/archive/MyBooks/LearnPython3TheHardWay/mypython/projects/teste/tests/test_example.py", line 10, in <module>
    from ..src.example import add_one
ImportError: attempted relative import with no known parent package
tests>

我知道還有多種其他方法可以從其他文件夾導入模塊,正如stackoverflow 本身這篇 11 年前的帖子中所述,但是點方法肯定是最簡單的方法,而且,因為它在官方文檔中有明確說明,它應該工作,但我不能讓它工作。

謝謝大家的關注。

編輯:

根據Raphael 的評論,我開始懷疑我的 python 安裝中存在錯誤/問題,因此在運行 Ubuntu LTS 20 的虛擬機中組裝了以下文件結構:

├── source │ ├── example.py │ └── init .py └── tests └── test_example.py

我在 test_example.py 中嘗試了多個導入命令,例如:

from .source.example import add_one
from ...source.example import add_one

依此類推,同樣,沒有一個有效。 由於我在我的主機上運行 Gentoo,我懷疑這個測試表明無論是什么問題,它肯定不是我的 python 安裝。

Python 中的一個常見問題是,針對 package 的測試找不到 package 本身。

問題的主要原因是您的工作目錄。 您不能只 cd 進入測試文件夾並運行測試。 事實上,你需要在你的項目文件夾之上一級,所以你需要在ex47_pypa/..然后運行python -m ex47_pypa.tests.test_example

這將為 Python 提供足夠的目錄層次結構來實際解析測試中的相對導入,因此可以解析from..src.example

我創建了一個實驗性的新導入庫: ultraimport

它使您可以更好地控制導入,並允許您進行基於文件系統的導入。

在您的test_example.py您可以這樣寫:

import ultraimport
add_one = ultraimport('__dir__/../src/example_package_VCMota/example.py', 'add_one')

這將始終有效,無論您如何運行您的代碼或您當前的工作目錄是什么或您的 sys.path 中有什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM