如何测试模块是否已在python中导入?
例如,我需要基础知识:
if not has_imported("sys"):
import sys
Run Code Online (Sandbox Code Playgroud)
也
if not has_imported("sys.path"):
from sys import path
Run Code Online (Sandbox Code Playgroud)
谢谢!
RGS.
感谢您的所有评论:代码已粘贴在此处. 自动导入文件夹中的所有子模块然后调用相同的名称函数 - python runtime inspect相关
我正在阅读如何检查是否已导入python模块并且说明似乎很清楚,检查中的模块sys.modules.这正如我在Python 2中所期望的那样,但不适用于Python 3(3.5和3.6测试).例如:
Python 3.6
>>> import sys
>>> 'itertools' in sys.modules
True
Run Code Online (Sandbox Code Playgroud)
Python 2.7
>>> import sys
>>> 'itertools' in sys.modules
False
Run Code Online (Sandbox Code Playgroud)
我注意到,itertools在Python 3 sys.modules dict(<module 'itertools' (built-in)>)中被描述为"内置" ,而不是在Python 2中,所以也许这就是它在sys.modules导入之前的原因,但它没有作为内置列出.无论如何,既然itertools仍然需要在Python 3中导入,我将不胜感激.
Python 3.6.5
使用这个答案math作为指导,我尝试查看是否导入了某些模块,例如。
但 Python 告诉我它们都被导入了,而实际上它们并没有导入。
>>> import sys
>>> 'math' in sys.modules
True
>>> 'math' not in sys.modules
False
>>> math.pi
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'math' is not defined
>>> import math
>>> 'math' in sys.modules
True
>>> math.pi
3.141592653589793
Run Code Online (Sandbox Code Playgroud) TL; DR:如果我使用的pytest还有其他一些仅测试的依赖项,是否可以断言这些仅测试的依赖项没有泄漏到实际的非测试代码中?
在Java中,当我运行测试时,测试本身和被测代码将在不同的类加载器中运行,并且它们的依赖关系在此作用域内。因此,如果无意中引用testng了被测代码,则即使testng正在运行测试,测试也将失败。
可以在Python中实现吗?如果我的非测试代码不小心导入了pytest,我可以抓住它并使测试失败吗?我看不到如何实现这一目标。
虽然setuptools和pip等,使其比较容易保持安装/运行和开发/测试的依赖分开,甚至避免污染当前VENV,他们仍然存在测试运行时。这意味着python setup.py test可以通过模块运行,但是python setup.py install导入该模块之后却很简单。
鉴于:
cat setup.py
from setuptools import setup, find_packages
setup(
name="brettpy",
version="0.0.1",
packages=find_packages(),
setup_requires=["pytest-runner",],
tests_require=["pytest",],
)
Run Code Online (Sandbox Code Playgroud)
cat setup.cfg
[aliases]
test=pytest
Run Code Online (Sandbox Code Playgroud)
cat brettpy/__init__.py
import pytest
Run Code Online (Sandbox Code Playgroud)
cat tests/test_brettpy.py
def test_import_brettpy():
import brettpy
del brettpy
def test_run_main():
from brettpy import __main__ as main
main.main()
Run Code Online (Sandbox Code Playgroud)
... python setup.py test将通过,但python setup.py install && python -m brettpy失败:
ModuleNotFoundError: No …Run Code Online (Sandbox Code Playgroud) 我想用来importlib重新加载其名称是动态生成的模块。
例:
import sys
def some_func():
return "sys"
want_reload = some_func()
Run Code Online (Sandbox Code Playgroud)
现在如何sys使用变量重新加载模块want_reload?我不能直接提供给它,importlib.reload()因为它说它需要一个模块,而不是str。
如果提供了无效的字符串或未加载的模块,则可能会更好,例如"........"引发异常。
这段代码解决了我遇到的问题.但是,没有重新加载就无法使用"setdefaultencoding".
什么是这种语言的怪癖叫什么?为什么我之前没有告诉过?我在哪里可以阅读更多相关信息.
import sys;
reload(sys);
sys.setdefaultencoding("utf8")
Run Code Online (Sandbox Code Playgroud)
从