python-3.x - 哪个文件夹在 python 模块发现中具有特殊作用?
问题描述
概括
如果一个模块放置在一个名为 的文件夹中test
,则如果不使用测试框架,它就无法执行。尽管test
首先将文件放在需要手动执行的文件夹中是一种不好的做法,因为名为 and 的文件夹具有test
特殊含义,但我希望也能够从文件夹中运行模块,因为代码和调用在语法上是正确的。unittest
pytest
test
情况
考虑以下文件结构:
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>
问题
哪些文件夹对模块发现有特定影响?这些偏差在哪里详细说明?
解决方案
推荐阅读
- java - 试图实现多态但错误:方法没有覆盖或实现超类型中的方法
- python - 双花括号在 bash 命令中的作用是什么?
- html - 如何使间距相对于屏幕宽度?
- c# - 从 XML 文件中读取密钥时遇到问题
- javascript - axios在参数名末尾添加[]
- python - Pandas Dataframe 遍历行
- shell - 为什么将带有文字引号的字符串传递给 xargs 会使它们消失?
- python - 使用 PyQt Painter 绘图
- python - Zapier 动作代码:Python input_data[] 从列表中剥离空值
- c# - 如何在不编译其他实现的情况下根据预处理器指令更改接口实现?