首页 > 解决方案 > 哪个文件夹在 python 模块发现中具有特殊作用?

问题描述

概括

如果一个模块放置在一个名为 的文件夹中test,则如果不使用测试框架,它就无法执行。尽管test首先将文件放在需要手动执行的文件夹中是一种不好的做法,因为名为 and 的文件夹具有test特殊含义,但我希望也能够从文件夹中运行模块,因为代码和调用在语法上是正确的。unittestpytesttest

情况

考虑以下文件结构:

call_proj
│
├───example
│       caller_in_e.py
│
├───src
│       pathprinter.py
│
└───test
        caller_in_test.py

珍贵的内容在src/pathprinter.py哪里

import sys
def print_n_return_two(text):
    print(text)
    print(sys.path)
    return 2
if __name__ == "__main__":
    print_n_return_two("from main")
else:
    print_n_return_two("not from main")

一个简单的调用者的内容example/caller_in_e.py是:

import src.pathprinter
src.pathprinter.print_n_return_two("from caller in example")

并且有问题的调用者的内容test/caller_in_test.py是:

import src.pathprinter
def test_pathprinter():
    assert 2 == src.pathprinter.print_n_return_two("from caller in test")

现在我可以调用位于根文件夹中的重要源代码,src即使我的密码在根文件夹中,有或没有-m开关,它们都给出相同的结果,即python -m src.pathprinter相同python .\src\pathprinter.py

我也可以使用example文件夹中的调用者,但只能使用-m开关(否则,src无法找到):

(base) PS C:\Users\tuzes\source\call_proj> python -m example.caller_in_e  
not from main
['C:\\Users\\tuzes\\source\\call_proj', 'C:\\Users\\tuzes\\miniconda3\\python39.zip', 'C:\\Users\\tuzes\\miniconda3\\DLLs', 'C:\\Users\\tuzes\\miniconda3\\lib', 'C:\\Users\\tuzes\\miniconda3', 'C:\\Users\\tuzes\\miniconda3\\lib\\site-packages', 'C:\\Users\\tuzes\\miniconda3\\lib\\site-packages\\win32', 'C:\\Users\\tuzes\\miniconda3\\lib\\site-packages\\win32\\lib', 'C:\\Users\\tuzes\\miniconda3\\lib\\site-packages\\Pythonwin']
from caller in example
['C:\\Users\\tuzes\\source\\call_proj', 'C:\\Users\\tuzes\\miniconda3\\python39.zip', 'C:\\Users\\tuzes\\miniconda3\\DLLs', 'C:\\Users\\tuzes\\miniconda3\\lib', 'C:\\Users\\tuzes\\miniconda3', 'C:\\Users\\tuzes\\miniconda3\\lib\\site-packages', 'C:\\Users\\tuzes\\miniconda3\\lib\\site-packages\\win32', 'C:\\Users\\tuzes\\miniconda3\\lib\\site-packages\\win32\\lib', 'C:\\Users\\tuzes\\miniconda3\\lib\\site-packages\\Pythonwin']
(base) PS C:\Users\tuzes\source\call_proj>

问题

我不能从test文件夹中调用调用者函数,也不能有或没有-m开关:

(base) PS C:\Users\tuzes\source\call_proj> python -m test.caller_in_test
C:\Users\tuzes\miniconda3\python.exe: No module named test.caller_in_test
(base) PS C:\Users\tuzes\source\call_proj>

它只能通过以下方式执行pytest

(base) PS C:\Users\tuzes\source\call_proj> python -m pytest                  
=========================== test session starts ============================
platform win32 -- Python 3.9.1, pytest-6.2.3, py-1.10.0, pluggy-0.13.1       
rootdir: C:\Users\tuzes\source\call_proj
plugins: pylama-7.7.1, mock-3.6.1
collected 1 item

test\caller_in_test.py .                                              [100%] 

============================ 1 passed in 0.09s ============================= 
(base) PS C:\Users\tuzes\source\call_proj>

问题

哪些文件夹对模块发现有特定影响?这些偏差在哪里详细说明?

标签: python-3.xtestingmodule

解决方案


推荐阅读