相关疑难解决方法(0)

Python - 从子文件夹执行绝对导入

基本上我问这个问题同样的问题:如何在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 python-import

12
推荐指数
1
解决办法
7932
查看次数

Python从子文件夹导入

我试图为每个学生在单独的文件夹中对一些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)

但是,没有该文件,它不起作用.

我发现的一些类似问题

但这些都没有给出特别令人满意的答案.

python python-import python-3.x

12
推荐指数
1
解决办法
2万
查看次数

ValueError:尝试非包中的相对导入而不是测试包

我知道这已被多次询问,但不知怎的,我无法克服这个错误.这是我的目录结构 -

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:在非包中尝试相对导入

任何帮助将非常感激.

python

12
推荐指数
1
解决办法
4万
查看次数

从Python中的姐妹子目录导入?

所以,我在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是脚本(当每个分别导入 - 未导入时)如何变化?

python import

10
推荐指数
1
解决办法
3779
查看次数

这是导入驻留在任意文件夹中的python脚本的正确方法吗?

这个片段来自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

9
推荐指数
1
解决办法
3996
查看次数

Python3 importlib.util.spec_from_file_location 与相对路径?

有很多关于如何导入相关包或通过显式位置的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

9
推荐指数
1
解决办法
6465
查看次数

从一级目录(包)导入模块

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.pypython -m sub_pkg/recipe.py没有奏效.

python

8
推荐指数
1
解决办法
9834
查看次数

Python __init__.py vs sys.path.append/insert

知道如何对导入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文件

python coding-style python-2.7

7
推荐指数
1
解决办法
7294
查看次数

Python 3.5 vs Python 2.7:模块导入子模块

在过去的几个小时中,我一直在使用Google搜索,在任何地方都找不到等效的问题。此外,2.7和3.5的文档似乎相同,因此我认为没有记录这种行为。

这是我的目录结构:

project
    -- project.py
    -- api
        -- __init__.py
        -- subapi
            -- __init__.py
Run Code Online (Sandbox Code Playgroud)

的内容project/project.pyimport api

的内容project/api/__init__.pyimport 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要求我将我的问题与另一个称为“如何进行相对进口”的问题区分开。我认为这个问题有所不同,因为我专门询问两个版本之间的差异。使用相对导入是解决方案,而不是问题。

python python-module python-2.7 python-3.5

6
推荐指数
1
解决办法
2853
查看次数

Python中导入模块的方法有哪些?

我做了一些研究,发现了以下文章:http : //effbot.org/zone/import-confusion.htm。虽然这似乎是一个很好的指南,但它写于 1999 年,不久前。我正在使用 Python 3.4.3,所以我认为有些事情发生了变化,这让我很担心,因为我不想学习不适用的内容。因此,在 Python 3 中,导入包和模块的所有方法是什么?哪些方式是最常见的,应该优先于其他方式使用?

python import python-import

5
推荐指数
1
解决办法
7256
查看次数