我正在尝试正确构建我的python 2.7项目(包含几个子目录)。我在每个级别上都添加了__init__.py文件,对于导入,似乎“最佳”做法是使用这种类型的绝对导入:
import top_package_folder.package_subfolder.module_name
Run Code Online (Sandbox Code Playgroud)
代替:
import .module_name
Run Code Online (Sandbox Code Playgroud)
即使我的代码位于package_subfolder目录中。
正如我最近了解到的那样,我现在正在寻找一种将所有这些相对进口自动转换为绝对进口的方法。
(我尝试使用autopep8,但无法使导入绝对。)
提前致谢。
可以使用在路径中引用两个以上点的模块吗?像这个例子:
# Project structure:
# sound
# __init__.py
# codecs
# __init__.py
# echo
# __init__.py
# nix
# __init__.py
# way1.py
# way2.py
# way2.py source code
from .way1 import echo_way1
from ...codecs import cool_codec
# Do something with echo_way1 and cool_codec.
Run Code Online (Sandbox Code Playgroud)
UPD:更改了示例。我知道,这将在实践中起作用。但这是一种常见的导入方法吗?
让我总结一下:
我有一个包含两个类的模块(注意:该模块位于一个包中):
自定义异常:
class MYAUTHError(Exception):
def __init__(self, *args, **kwargs):
print('--- MYAUTHError!!! ---')
Run Code Online (Sandbox Code Playgroud)
和一个使用此异常的类(这里是一个示例):
try:
resp_login.raise_for_status()
except requests.exceptions.HTTPError as ex:
logging.error("ERROR!!! : user authentication failed)
raise MYAUTHError('oups')
Run Code Online (Sandbox Code Playgroud)
在这个模块(文件)内我知道这是有效的。例如,我可以编写这样的代码并验证是否捕获了我的自定义异常:
try:
raise MYAUTHError('oups')
except MYAUTHError:
print("got it")
Run Code Online (Sandbox Code Playgroud)
但是,当从另一个模块(导入此模块的模块)使用时,我没有成功捕获此自定义异常......
from mypackage import mymodulewithexception
# somewhere in the code, just to test. OK : my class is known.
extest = mymodulewithexception.MYAUTHError('**-test-**')
print(type(extest))
# but this does not catch anything :
except mymodulewithexception.MYAUTHError as ex:
logging.error("Authentication failed", ex)
return
Run Code Online (Sandbox Code Playgroud)
我确信,异常被抛出,因为调用模块是一个 Flask 应用程序,并且调试服务器清楚地向我显示异常被抛出,因为它没有被处理。
在试图理解这一点时,我只是用另一个著名的异常替换了我的自定义异常:ValueError。我更改了调用模块中的代码以捕获此内容:当然,这有效。
我什至尝试捕获异常(真正的通用类):
except mymodulewithexception.MYAUTHError …Run Code Online (Sandbox Code Playgroud) 我正在使用Python 2.6.
我只在我的应用程序中使用绝对导入.现在我有这个:
myapp
|
-- myscript
-- json
|
-- anotherscript.py
Run Code Online (Sandbox Code Playgroud)
在myscript中,我有:
import json
import myapp.json.anotherscript
Run Code Online (Sandbox Code Playgroud)
由于Python的相对导入机制,导入json不会导入我想要的内置库,而是将我的自定义json包导入当前命名空间.
有没有办法在Python中禁用相对导入,或至少在这种情况下避免使用它?否则,我将不得不将我的包重命名为与jsonutils没有多大意义的其他东西.
提前致谢.
我正在尝试从不同的项目导入包,但它无法识别我尝试从中导入的项目。我已经查看了这个问题的各种答案(包括python: import another project module named same with a local module)。
我的项目结构如下所示:
Project1
- __init__.py
- foo_directory
- foo.py
- __init__.py
Project2
- __init__.py
-bar_directory
- bar.py
- __init__.py
Run Code Online (Sandbox Code Playgroud)
在 bar.py 中我试图这样做:
import sys
sys.path.append('path/to/Project2')
from Project1.foo_directory import foo.py
Run Code Online (Sandbox Code Playgroud)
我不明白为什么当我尝试导入时它无法识别 Project1?
我的项目具有以下结构:
DSTC/
st/
__init__.py
a.py
g.py
tb.py
dstc.py
Run Code Online (Sandbox Code Playgroud)
这是a.py部分:
import inspect
import queue
import threading
Run Code Online (Sandbox Code Playgroud)
这是tb.py部分:
import functools
from . import a
Run Code Online (Sandbox Code Playgroud)
直接运行时,a.py不会产生任何错误,并且很容易验证没有SyntaxErrors。但是,运行tb.py会导致以下错误:
"C:\Program Files\Python36\python.exe" C:/Users/user/PycharmProjects/DSTC/st/tb.py
Traceback (most recent call last):
File "C:/Users/user/PycharmProjects/DSTC/st/tb.py", line 15, in <module>
from . import a
ImportError: cannot import name 'a'
Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)
我应该如何重写afrom的导入,tb以便tb可以直接运行而不会导致错误?
当我在 PyCharm 社区版中编写 Python3 代码时,我对导入逻辑感到恼火,下面是我的结构。
\n\nproject\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 orm.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 coroweb.py\nRun Code Online (Sandbox Code Playgroud)\n\n在 app.py 中,我使用下面的代码导入 orm 。
\n\nfrom . import orm\nfrom .coroweb import xxx\nRun Code Online (Sandbox Code Playgroud)\n\n它在 PyCharm 中看起来不错,但是当我运行 app.py 时,它会由于以下错误而失败
\n\nImportError: cannot import name 'orm'\nRun Code Online (Sandbox Code Playgroud)\n\n然后,我像这样使用相关导入。
\n\nimport orm\nfrom coroweb import xxx\nRun Code Online (Sandbox Code Playgroud)\n\n它运行良好,但在 PyCharm 中出现导入错误。它是Unresolved reference。我想在 PyCharm 中使用代码跟踪,所以我想知道如何解决这个问题。
我正在尝试从终端运行我的项目,但我一直在获取ModuleNotFoundError: No module named 'config'. 我的项目结构是:
Project folder
-config
-settings.py
-folder1
-folder2
-pythonfile.py
Run Code Online (Sandbox Code Playgroud)
在 folder1/folder2/ 我运行脚本 -->python3 -m pythonfile.py但我得到 No module named config。PyCharm 中的 Run 按钮的工作方式与 Charm 类似,但我想从终端运行脚本。我还检查了 sys.path 并且我已经获得了项目 /home/name/Desktop/Project 和 /home/name/Desktop/Project/folder1/folder2/ 的根路径。
Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 183, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/usr/lib/python3.6/runpy.py", line 109, in _get_module_details
__import__(pkg_name)
File "/home/name/Desktop/Project/folder1/folder2/pythonfile.py", line 4, in <module>
from config import settings as CONFIG
ModuleNotFoundError: No module named 'config'
Run Code Online (Sandbox Code Playgroud) 已经有 10 多篇关于此问题的帖子了,没有一个答案对我有用,而且我仍然没有看到有人从同级目录导入某些内容的示例。
src
__init__.py
test.py
package1
__init__.py
module1.py
package2
__init__.py
module2.py
Run Code Online (Sandbox Code Playgroud)
(_ init _.py 在大于 3.3 的 python 版本上不是必需的,但我仍然保留它们,因为它们没有区别)
在 test.py 我有
import package1.module2
Run Code Online (Sandbox Code Playgroud)
它工作正常,但问题是当我想将某些内容从 package2 导入到 package1 时,反之亦然。我在 module2.py 中尝试了不同的导入方法,但收到了以下不同的错误消息:
import src.package1.module1.py
Run Code Online (Sandbox Code Playgroud)
出现错误:
ModuleNotFoundError: No module named 'src'
Run Code Online (Sandbox Code Playgroud)
和
from .. import package1
Run Code Online (Sandbox Code Playgroud)
出现错误:
ImportError: attempted relative import with no known parent package
Run Code Online (Sandbox Code Playgroud)
这里的最佳答案是:如何从同级目录导入 Python 脚本?还给我确切的错误消息,如我上面所示。答案在这里:如何从同级文件夹导入 Python 模块?没有任何改变。我是否遗漏了某些内容,或者是否无法在不同文件夹/包之间导入内容?我需要“sys.path hack”吗?
from .. import模块正常工作,模块名称的点数必须至少与语句中的点数一样多import。__main__我喜欢在编写生产代码之前使用交互式 Jupyter Notebook 会话来探索数据和测试模块。为了让事情变得清晰易懂,让队友可以理解,我喜欢将笔记本放在一个interactive包中,与我正在测试的包和模块并排放置。
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
moduleZ.py
subpackage2/
__init__.py
moduleZ.py
interactive/
__init__.py
my_notebook.ipynb
Run Code Online (Sandbox Code Playgroud)
在交互式会话期间interactive.my_notebook.ipynb,您将如何导入其他模块,例如subpackage1.moduleX和subpackage2.moduleZ?
python ×9
python-3.x ×3
exception ×2
import ×2
coding-style ×1
ipython ×1
module ×1
pycharm ×1
python-2.7 ×1
python-3.4 ×1
reference ×1