我想从同一目录中的另一个文件导入一个函数.
有时它适用于我,from .mymodule import myfunction但有时我会得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
有时它适用from mymodule import myfunction,但有时我也得到:
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
我不明白这里的逻辑,我找不到任何解释.这看起来完全随机.
有人可以向我解释这一切背后的逻辑是什么吗?
我无法将项目的单元测试集成到 VSCode 中。测试发现失败,因为 pytest 无法识别源文件。
(只是为了澄清,这是一个关于 VSCode 的问题,而不是关于 pytest 的问题。我在这里是因为 VSCode 将其问题部分链接到 SOF。如果我手动运行测试,测试可以正常工作。)
工装:pyenv, pipenv, pytest.
项目布局:
/src -> source code
/tests/unit -> test code
Run Code Online (Sandbox Code Playgroud)
.vscode/settings.json:
{
"python.envFile": "${workspaceFolder}/.env",
"python.testing.pytestEnabled": true,
"python.testing.pytestArgs": [
"tests"
],
"python.testing.unittestEnabled": false,
"python.testing.nosetestsEnabled": false
[...]
}
Run Code Online (Sandbox Code Playgroud)
.env:
PYTHONPATH=./src
Run Code Online (Sandbox Code Playgroud)
(注意:我认为 .env 在这里并不重要,根据此评论,在Use of the PYTHONPATH variable下)
测试发现失败并显示:
tests/unit/test_revoke_default_sg.py:7: in <module>
from revokedefaultsg.app import RevokeDefaultSg, UnknownEventException
E ModuleNotFoundError: No module named 'revokedefaultsg'
=========================== short test summary info …Run Code Online (Sandbox Code Playgroud) 我试图让用户在他们认为合适的任何文件夹名称下将代码编写为 python 模块(定义了 __init__.py 的文件夹)。之后我想将该模块安装为 python 包,但自己定义导入名称。
文件夹结构如下:
project_name/
user_defined_name/
__init__.py
...
setup.py
Run Code Online (Sandbox Code Playgroud)
根据这个我应该能够加入到我的setup.py得到它的工作:
setuptools.setup(
package_dir={'my_defined_name': 'user_defined_name'},
packages=['user_defined_name']
)
Run Code Online (Sandbox Code Playgroud)
但我能够访问代码的唯一方法是使用import user_defined_name. 我尝试在没有 -e 的情况下安装软件包,但结果相同。离开packages=['..']设置功能也没有改变结果。
我的问题与这个问题类似,唯一的答案似乎是更改文件夹名称,这是我想避免的。该问题提到这可能是由于 setuptools 中的问题,但似乎在 3 年前就已解决。