这是我第一次真正坐下来尝试python 3,似乎失败了.我有以下两个文件:
config.py中定义了一些函数以及一些变量.我把它剥离到以下内容:
但是,我收到以下错误:
ModuleNotFoundError: No module named 'config'
Run Code Online (Sandbox Code Playgroud)
我知道py3约定是使用绝对导入:
from . import config
Run Code Online (Sandbox Code Playgroud)
但是,这会导致以下错误:
ImportError: cannot import name 'config'
Run Code Online (Sandbox Code Playgroud)
所以我不知道该怎么做......非常感谢任何帮助.:)
我有一个类似于以下的目录结构
meta_project
project1
__init__.py
lib
module.py
__init__.py
notebook_folder
notebook.jpynb
Run Code Online (Sandbox Code Playgroud)
当notebook.jpynb
我尝试使用相对导入来访问函数function()
时module.py
使用:
from ..project1.lib.module import function
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
SystemError Traceback (most recent call last)
<ipython-input-7-6393744d93ab> in <module>()
----> 1 from ..project1.lib.module import function
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个使用相对导入工作?
请注意,笔记本服务器在meta_project
目录级别实例化,因此它应该可以访问这些文件中的信息.
另请注意,至少与最初的预期project1
并未被视为模块,因此没有__init__.py
文件,它只是作为文件系统目录.如果问题的解决方案需要将其视为一个模块并包含一个__init__.py
文件(即使是空白文件),那么这样做是不错的,但这样做不足以解决问题.
我在机器和相对导入之间共享这个目录允许我在任何地方使用相同的代码,并且我经常使用笔记本进行快速原型设计,因此涉及黑客攻击绝对路径的建议不太可能有用.
编辑:这与Python 3中的相对导入不同,Python 3通常讨论Python 3中的相对导入,特别是从包目录中运行脚本.这与在jupyter笔记本中工作有关,该笔记本试图在另一个具有不同的一般和特定方面的目录中的本地模块中调用函数.
在过去的一小时里,我一直在为我的包裹中的进口做斗争.
我有一个像这样的目录结构:
main_package
|
| __init__.py
| folder_1
| | __init__.py
| | folder_2
| | | __init__.py
| | | script_a.py
| | | script_b.py
|
| folder_3
| | __init__.py
| | script_c.py
Run Code Online (Sandbox Code Playgroud)
我想访问代码script_b.py
以及script_c.py
来自的代码script_a.py
.我怎样才能做到这一点?
如果我把一个简单的import script_b
内部script_a.py
,当我跑
from main_package.folder_1.folder_2 import script_b
Run Code Online (Sandbox Code Playgroud)
我遇到了一个
ImportError: no module named "script_b"
Run Code Online (Sandbox Code Playgroud)
为了访问script_c.py
,我不知道.我无法找到有关访问两级文件的任何信息,但我知道我可以导入一级文件
from .. import some_module
Run Code Online (Sandbox Code Playgroud)
如何从中访问这两个文件script_a.py
?
python directory-structure python-import python-3.x relative-import
这是我的文件夹结构:
Mopy/ # no init.py !
bash/
__init__.py
bash.py # <--- Edit: yep there is such a module too
bass.py
bosh/
__init__.py # contains from .. import bass
bsa_files.py
...
test_bash\
__init__.py # code below
test_bosh\
__init__.py
test_bsa_files.py
Run Code Online (Sandbox Code Playgroud)
在test_bash\__init__.py
我有:
import sys
from os.path import dirname, abspath, join, sep
mopy = dirname(dirname(abspath(__file__)))
assert mopy.split(sep)[-1].lower() == 'mopy'
sys.path.append(mopy)
print 'Mopy folder appended to path: ', mopy
Run Code Online (Sandbox Code Playgroud)
在test_bsa_files.py
:
import unittest
from unittest import TestCase
import bosh
class TestBSAHeader(TestCase):
def …
Run Code Online (Sandbox Code Playgroud) python python-import python-2.7 relative-import python-unittest
所以,我的文件/文件夹结构如下:
\nproject/\n\xe2\x94\x9c\xe2\x94\x80 utils/\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80 module.py\n\xe2\x94\x9c\xe2\x94\x80 server/\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80 main.py\n
Run Code Online (Sandbox Code Playgroud)\n在里面project/server/main.py
我尝试project/utils/module.py
使用以下语法导入:from ..utils.module import my_function
。
我正在使用 VSCode,当我输入模块路径时,它甚至会自动完成。但是当我运行该文件时project/server/main.py
,我在标题中收到错误。
我已经在堆栈溢出上阅读了有关此主题的数十个答案,但没有一个使用这样的示例。
\n我试图为简单的Python脚本生成可执行文件.我的setup.py代码如下所示:
from distutils.core import setup
import py2exe
setup(console=["script.py"])
Run Code Online (Sandbox Code Playgroud)
但是,我收到屏幕截图中显示的错误.有什么我可以尝试解决这个问题吗?我使用的是Windows 10.
我已经尝试了几天来解决项目中的相对导入错误,但没有成功。我有以下项目树:
proj
|
|---__init__.py
|
|---lib
| |---__init__.py
| |---func.py
|
|---src
| |---main.py
Run Code Online (Sandbox Code Playgroud)
这__init__.py
是一个空文件。
包含func.py
打印功能:
def hello_func():
print("Hello !!!")
Run Code Online (Sandbox Code Playgroud)
这main.py
:
from ..lib import *
hello_func()
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到此错误:
ImportError: attempted relative import with no known parent package
Run Code Online (Sandbox Code Playgroud)
有人遇到同样的问题吗?
无论何时使用PyCharm提供的autoimport,它都会生成绝对路径导入.即
from my_package.my_subpackage import my_thing
Run Code Online (Sandbox Code Playgroud)
代替
from .my_subpackage import my_thing
Run Code Online (Sandbox Code Playgroud)
导入python包时是否有使用相对导入而不是绝对导入的设置?
假设我有以下结构:
\n\n dir_1\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 functions.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 dir_2\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 code.ipynb\n
Run Code Online (Sandbox Code Playgroud)\n\n在,,code.ipynb
我只是想访问里面的一个函数functions.py
并尝试了这个:
from ..functions import some_function\n
Run Code Online (Sandbox Code Playgroud)\n\n我收到错误:
\n\nattempted relative import with no known parent package\n
Run Code Online (Sandbox Code Playgroud)\n\n我已经检查了一堆类似的帖子,但还没有弄清楚这一点...我正在从 a 运行 jupyter 笔记本,conda env
我的 python 版本是3.7.6
.
我如何组织我的python导入,以便我可以拥有这样的目录.
project
| \
| __init__.py
|
src
| \
| __init__.py
| classes.py
|
test
\
__init__.py
tests.py
Run Code Online (Sandbox Code Playgroud)
然后在/project/test/tests.py中可以导入classes.py
我在tests.py中看到了这样的代码
from .. src.classes import(
scheduler
db
)
Run Code Online (Sandbox Code Playgroud)
而且我得到了错误
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
谁知道该怎么办?
python ×10
relative-import ×10
python-3.x ×3
anaconda ×1
import ×1
module ×1
package ×1
parent ×1
py2exe ×1
pycharm ×1
python-2.7 ×1