基本上我问这个问题同样的问题:如何在Python中进行相对导入?
但没有人给他一个正确的答案.鉴于你在一个子文件夹中,你想要上一个目录,然后进入另一个子文件夹,做他们建议的不起作用(正如OP在他的评论中指出的那样).
我知道你可以通过使用sys.path来做到这一点,但我更喜欢一个更干净的方法.
例:
App
__init__.py
Package_A
--__init__.py
--Module_A.py
Package_B
--__init__.py
--Module_B.py
Run Code Online (Sandbox Code Playgroud)
如何将Module_A导入Module_B?
我试图为每个学生在单独的文件夹中对一些python提交进行评分.要做到这一点,有一个函数,比如我想运行的f().我知道如果我当前的路径与文件所在的路径相同,我可以这样做
import filename
filename.f()
Run Code Online (Sandbox Code Playgroud)
但是,还有更好的方法吗?例如,假设目录结构如下:
main.py
student/run_this.py
Run Code Online (Sandbox Code Playgroud)
我知道如果学生文件夹中有"__init__.py"文件,我可以输入
import student.run_this
Run Code Online (Sandbox Code Playgroud)
但是,没有该文件,它不起作用.
我发现的一些类似问题
但这些都没有给出特别令人满意的答案.
我知道这已被多次询问,但不知怎的,我无法克服这个错误.这是我的目录结构 -
project/
pkg/
__init__.py
subpackage1/
script1.py
__init__.py
subpackage2/
script2.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
script2.py有:
class myclass:
def myfunction:
Run Code Online (Sandbox Code Playgroud)
script1.py有
from ..subpackage2 import script2
Run Code Online (Sandbox Code Playgroud)
我也试过了
from ..subpackage2 import myclass
Run Code Online (Sandbox Code Playgroud)
这给了我:ValueError:在非包中尝试相对导入
任何帮助将非常感激.
所以,我在Stack Overflow上看到了一些类似的问题,但似乎没有解决我的问题或一般情况.所以,希望这个问题可以解决这个问题,并且让我头痛不已.我有一个形式的git repo:
repo/
__init__.py
sub1/
__init__.py
sub1a/
__init.py
mod1.py
sub2/
__init__.py
mod2.py
Run Code Online (Sandbox Code Playgroud)
如何从mod1.py导入mod2.py,反之亦然,这取决于mod1.py或mod2.py是脚本(当每个分别导入 - 未导入时)如何变化?
这个片段来自SO的早期答案.它大约一岁(答案未被接受).我是Python的新手,我发现系统路径真的很痛苦.我有一些用不同目录的脚本编写的函数,我希望能够将它们导入到新项目中,而不必跳过箍.
这是片段:
def import_path(fullpath):
""" Import a file with full path specification. Allows one to
import from anywhere, something __import__ does not do.
"""
path, filename = os.path.split(fullpath)
filename, ext = os.path.splitext(filename)
sys.path.append(path)
module = __import__(filename)
reload(module) # Might be out of date
del sys.path[-1]
return module
Run Code Online (Sandbox Code Playgroud)
它来自这里: 如何在Python中进行相对导入?
我想要一些反馈,我是否可以使用它 - 如果有任何不良副作用对新手来说可能不明显.
我打算用它这样的东西:
import_path(/home/pydev/path1/script1.py)
script1.func1()
Run Code Online (Sandbox Code Playgroud)
等等
以我打算的方式使用该功能是否"安全"?
有很多关于如何导入相关包或通过显式位置的python问题(链接到两个流行示例)。
此外,总有 文档
读完这篇文章后,我仍然不太确定规范是什么,它们与模块的关系如何,以及为什么需要对其进行标记。
因此,对于不理解的人,您能否尝试解释一下如何做到这一点(以编程方式以及幕后的含义)
例如
如果我有
proj-dir
--mod1
--|--__init__.py
--|--class1.py
--mod2
--|--__init__.py
--|--class2.py
Run Code Online (Sandbox Code Playgroud)
如何将 mod2 导入 mod1?
import sys
sys.path.insert(0, "../mod2")
Run Code Online (Sandbox Code Playgroud)
这在技术上是有效的,但我担心如果我尝试腌制对象并在其他地方使用它们,将来可能会导致问题......
在明确定位建议
import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,我只是这样做:
import importlib.util
spec = importlib.util.spec_from_file_location("mod2.class2", "../mod2/class2.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()
Run Code Online (Sandbox Code Playgroud)
??
Python从一级目录导入模块的正确方法是什么?该目录是一个包含所有这些模块的Python包,我有一个子目录,其中包含需要这些模块的代码.
以下工作正常,但这只是一个黑客.我想要推荐/ pythonic方式.
import sys
sys.path.append("../")
from fruit import Fruit
print("OK")
Run Code Online (Sandbox Code Playgroud)
目录结构:
pkg1
__init__.py
fruit.py
+sub_pkg
__init__.py
recipe.py
Run Code Online (Sandbox Code Playgroud)
fruit.py的内容
class Fruit:
def get_name(self):
print("Fruit name")
Run Code Online (Sandbox Code Playgroud)
sub_pkg/recipe.py..的内容只是一个导入行:
from fruit import Fruit
Run Code Online (Sandbox Code Playgroud)
当我跑:
python recipe.py
Run Code Online (Sandbox Code Playgroud)
它给出了以下错误.
Traceback (most recent call last):
File "recipe.py", line 2, in <module>
from fruit import Fruit
ImportError: No module named fruit
Run Code Online (Sandbox Code Playgroud)
我也试过:from pkg1.fruit import Fruit,不行.还看了其他类似的问题..
python -m recipe.py 或python -m sub_pkg/recipe.py没有奏效.
我知道有是一吨的如何对导入Python模块不在路径,但我还没有遇到过使用Python的__init.py__ VS sys.path.insert.哪种方法更好?是否有任何明显的缺点,如性能?还有一个"Pythonic?"
我能想到的一个场景是,我有一个用户下载并放在任何目录中的程序,所以我不知道绝对路径(除非我以编程方式得到它).文件夹结构是
working dir
__init__.py
foo.py
src/
my_utils.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
我没有看到使用__init__.py或更改sys.path之间的任何区别.有没有什么方案你可以想到它会产生什么影响?
我的问题的第2部分是,为什么你必须做任何事情才能从子目录导入模块?我对Python很新,所以也许我不明白为什么摆弄路径或创建init文件是样板文件.对我来说,这似乎是一种不必要的复杂情况.如果我在当前工作目录中有"dir"并说"import dir.my_utils",我不明白为什么我要列出我希望能够在__init__.py中导入的所有内容.
如果这是重复的道歉,但我在发布之前进行了搜索.
编辑:这是另一个有用的链接:自动调用常见的初始化代码而不创建__init__.py文件
在过去的几个小时中,我一直在使用Google搜索,在任何地方都找不到等效的问题。此外,2.7和3.5的文档似乎相同,因此我认为没有记录这种行为。
这是我的目录结构:
project
-- project.py
-- api
-- __init__.py
-- subapi
-- __init__.py
Run Code Online (Sandbox Code Playgroud)
的内容project/project.py:import api
的内容project/api/__init__.py:import subapi
如果我python project.py从projects文件夹中执行(使用python 2.7),它将返回而不会出现错误。如果我对python 3(python3 project.py)执行相同操作,则崩溃
Traceback (most recent call last):
File "project.py", line 1, in <module>
import api
File "/home/me/Documents/project/api/__init__.py", line 1, in <module>
import subapi
ImportError: No module named 'subapi'
Run Code Online (Sandbox Code Playgroud)
如果我重写import语句以使用相对于项目目录(import api.subapi)的路径,则它适用于python 2和3。虽然这不是令人满意的解决方案,因为这要求我从子模块中引用父模块,这会导致失败。模块化的思想
有谁知道我该怎么做才能恢复python2的行为?模块搜索算法应优先使用import语句在文件的本地目录中搜索。顺便说一句,它还应优先考虑上述内置模块中的这些文件。尝试导入模块“测试”。
-编辑-stackoverflow要求我将我的问题与另一个称为“如何进行相对进口”的问题区分开。我认为这个问题有所不同,因为我专门询问两个版本之间的差异。使用相对导入是解决方案,而不是问题。
我做了一些研究,发现了以下文章:http : //effbot.org/zone/import-confusion.htm。虽然这似乎是一个很好的指南,但它写于 1999 年,不久前。我正在使用 Python 3.4.3,所以我认为有些事情发生了变化,这让我很担心,因为我不想学习不适用的内容。因此,在 Python 3 中,导入包和模块的所有方法是什么?哪些方式是最常见的,应该优先于其他方式使用?