标签: python-import

导入子模块的子模块上出现 ModuleNotFoundError

假设我们有以下结构:

outer_module.py|
               |subfolder|
                         |__init__.py
                         |inner_module.py
                         |foo.py
Run Code Online (Sandbox Code Playgroud)

outer_module.py我们会有:

from subfolder.inner_module import X
Run Code Online (Sandbox Code Playgroud)

inner_module.py我们会有:

from foo import Y
Run Code Online (Sandbox Code Playgroud)

然后我就开始ModuleNotFoundError: No module named 'foo'运行outer_module.py. 如何导入这个导入子模块的子模块而不出现 ModuleNotFoundError?

python python-import python-3.x

3
推荐指数
1
解决办法
4177
查看次数

项目的 python 设置 - 循环导入/依赖注入

我为不同的环境创建了“Django 风格”设置文件。设置文件定义了一些变量,并且还充当其他模块的依赖注入。

所以结构是:

settings/
    ___init__.py
    base.py
    dev.py
    dev2.py
    prod.py

service/
    __init__.py
    service.py
    service_mock.py
Run Code Online (Sandbox Code Playgroud)

我在其中settings/__init__.py写道:

settings_env = os.environ.get('PROJECT_SETTINGS', '')
if settings_env == 'prod':
   from .prod import *
elif settings_env == 'dev':
   from .dev import *
Run Code Online (Sandbox Code Playgroud)

每个设置文件定义不同的一些变量,并且还从service.py或导入一个类service_mock.py,取决于环境变量。
这基本上工作得很好。

现在的问题是无法service.py导入设置包,因为设置文件导入了service.py,这样就会变成循环导入。

正如我在 Django 中看到的,它是通过在设置文件中使用导入字符串而不是实际导入来解决的。我不太喜欢这个想法,因为我失去了一些 IDE 自动完成功能,而且我不确定如何实际创建 Django 提供的设置对象。

解决这个问题的方法有哪些?是否有一个设置文件用作导入模块的依赖项注入容器,并由相同的模块导入?最好是一个简单的解决方案。

python settings dependency-injection python-import

3
推荐指数
1
解决办法
1220
查看次数

如何导入我通过 --py-files 添加到集群的 python 模块?

我有一些想要在应用程序中使用的自定义 jdbc 驱动程序。当我将 Spark 提交到 Kubernetes Spark 集群时,我将这些包含为 --py-files:

spark-submit --py-files s3a://bucket/pyfiles/pyspark_jdbc.zip my_application.py
Run Code Online (Sandbox Code Playgroud)

这给了我:

java.io.FileNotFoundException: File file:/opt/spark/work-dir/pyspark_jdbc.zip does not exist
Run Code Online (Sandbox Code Playgroud)

正如其他答案告诉我的那样,我实际上需要将该 zip 文件添加到 PYTHONPATH 中。现在,我发现至少在 Spark 2.3+ 中不再如此,但让我们这样做:

spark.sparkContext.addPyFile("pyspark_jdbc.zip")
Run Code Online (Sandbox Code Playgroud)

查看集群日志,我看到:

19/10/21 22:40:56 INFO Utils: Fetching s3a://bucket/pyfiles/pyspark_jdbc.zip to 
/var/data/spark-52e390f5-85f4-41c4-9957-ff79f1433f64/spark-402e0a00-6806-40a7-a17d-5adf39a5c2d4/userFiles-680c1bce-ad5f-4a0b-9160-2c3037eefc29/fetchFileTemp5609787392859819321.tmp
Run Code Online (Sandbox Code Playgroud)

因此,pyfiles 肯定被导入,但导入/var/data/...而不是导入我的工作目录。因此,当我将 .zip 文件的位置添加到 python 路径时,我不知道它在哪里。在尝试添加 python 文件之前对集群进行一些诊断:

> print(sys.path)
[..., 
 '/var/data/spark-52e390f5-85f4-41c4-9957-ff79f1433f64/spark-402e0a00-6806-40a7-a17d-5adf39a5c2d4/userFiles-680c1bce-ad5f-4a0b-9160-2c3037eefc29', 
 '/opt/spark/work-dir/s3a', 
 '//bucket/pyfiles/pyspark_jdbc.zip'
...]
> print(os.getcwd())
/opt/spark/work-dir
> subprocess.run(["ls", "-l"])
total 0
Run Code Online (Sandbox Code Playgroud)

所以我们看到 pyspark 确实尝试将s3a://我通过--py-filesPYTHONPATH 添加的文件添加到 PYTHONPATH 中,只是它错误地解释了:并且没有正确添加路径。该/var/data/...目录位于 PYTHONPATH …

import python-import apache-spark pyspark

3
推荐指数
1
解决办法
2591
查看次数

ImportError:无法从“azure.storage.blob”导入名称“BlockBlobService”

我正在尝试将 Azure blob 容器中的文本文件从 ANSI 编码转换为 UTF-8 编码,而不使用 python 将文件下载到本地。当我尝试在 Python 代码中导入BlockBlobService来处理 Azure Blob 存储时,出现以下错误。我相信我已经安装了正确的 python 模块,但可能还缺少一些我不知道的其他模块,或者可能是“没有正确的 python 模块版本”。“pip list”命令在我的虚拟机上显示以下内容。对此有任何帮助都会很好。

pip list 包 版本


azure-common         1.1.25
azure-core           1.4.0
azure-nspkg          3.0.2
azure-storage        0.36.0
azure-storage-blob   12.3.0
azure-storage-common 2.1.0
azure-storage-nspkg  3.1.0
bcrypt               3.1.7
certifi              2020.4.5.1
cffi                 1.14.0
chardet              3.0.4
cryptography         2.9
idna                 2.9
isodate              0.6.0
msrest               0.6.13
oauthlib             3.1.0
paramiko             2.7.1
pip                  20.0.2
pycparser            2.20
PyNaCl               1.3.0
python-dateutil      2.8.1
requests             2.23.0
requests-oauthlib    1.3.0
setuptools           41.2.0
six                  1.14.0
urllib3              1.25.8
wheel                0.34.2
Run Code Online (Sandbox Code Playgroud)

python ansi utf-8 python-import azure-blob-storage

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

如何修复此错误:“ImportError:DLL 加载失败:找不到指定的模块。” 使用 PyQt5

我目前使用 Python 3.6.8 和 PyQt5。我的程序运行良好,但在 Windows 更新后,一切都停止运行。

这是错误:

Traceback (most recent call last):
  File "main.py", line 10, in <module>
    from PyQt5 import QtWidgets, QtCore, QtGui
ImportError: DLL load failed: The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)

python pyqt python-import python-3.x pyqt5

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

我应该从 __dir__ 方法隐藏 python 模块中依赖项的导入吗?

我正在使用单个导入包制作一个 Python 分发包,该导入包具有多个模块(一个文件夹,多个文件)。该包具有在模块中导入的依赖项。当用户从导入包导入模块时,他们还可以访问在函数外部导入的依赖项。我已经找到了解决方法,但我不确定这是否是一个好主意。

模块joke.py的选项A

from markdown import markdown

def joke():
    return markdown("The Funniest Joke in the World")

Run Code Online (Sandbox Code Playgroud)

joke.py 模块的选项 B

def joke():
    from markdown import markdown
    return markdown("The Funniest Joke in the World")

Run Code Online (Sandbox Code Playgroud)

A在交互模式下的使用

>>> import joke
>>> joke.joke()
'The Funniest Joke in the World'
>>> dir(joke)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'joke', 'markdown']
>>> joke.markdown("Not funny")
'<p>Not funny</p>'
Run Code Online (Sandbox Code Playgroud)

B在交互模式下的使用

>>> import joke
>>> dir(joke)
['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__file__', '__cached__', '__builtins__', 'joke', 'markdown']
>>> joke.markdown("Not …
Run Code Online (Sandbox Code Playgroud)

python python-module python-import python-3.x

3
推荐指数
1
解决办法
1145
查看次数

唯一导入*仅允许在模块级别

我正在制作一个实用程序,其中内置了多个程序,但我对程序进行了一些更改,以便在用户提示时重新运行,然后由于某种原因,我面临错误

import * only allowed at module level
Run Code Online (Sandbox Code Playgroud)

这是我的代码

def main():
    
    import os
    import sys
    import time
    import pywhatkit as whatsapp
    from speedtest import Speedtest
    from tkinter import *
    from tkinter import messagebox
    from os import listdir
    from PIL import Image

    print("*"*30)
    print("Utility Build v1: Starting")
    print("*"*30)

    time.sleep(3)

    print("NOTE: Before using this program for repairing corrupted disk, please locate this utility .py file into the corrupted storage. Thanks")

    time.sleep(3)

    print("*"*30)
    print("*"*30)
    print("Commands: Choose by inputting allocated number")

    print("Utility 1: Speed …
Run Code Online (Sandbox Code Playgroud)

python syntax-error python-import

3
推荐指数
1
解决办法
3503
查看次数

如何从 pytest 引用我的 Azure 函数?

我正在使用带有 Azure 函数的 Python 3.8。我有以下项目布局...

myproject
    __app__
        __init__.py
        objects
            __init__.py
    tests
        __init__.py
        functions
            __init__.py
            objects
                __init__.py
                test_objects.py
Run Code Online (Sandbox Code Playgroud)

我的应用程序/objects/ init .py 文件像这样开始......

import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    """."""
    ...
Run Code Online (Sandbox Code Playgroud)

然后我的测试/函数/对象/ init .py 看起来像

import pytest
import azure.functions as func

_import = __import__('__app__/objects')

def test_objects():
    ...
    
Run Code Online (Sandbox Code Playgroud)

然而,当我跑步时

pytest tests/functions/test_objects.py 
Run Code Online (Sandbox Code Playgroud)

我收到错误

tests/functions/test_objects.py:8: in <module>
    _import = __import__('__app__/objects')
E   ModuleNotFoundError: No module named '__app__/objects'
Run Code Online (Sandbox Code Playgroud)

引用我的函数的正确方法是什么?我也尝试了“对象”,但这会导致相同的 ModuleNotFoundError 。

import python-import pytest python-3.x azure-functions

3
推荐指数
1
解决办法
2633
查看次数

如何使用模块作为包的一部分和直接可执行的脚本?

假设我有一个名为 的包文件夹my_package。该目录包含一个名为 的文件__init__.py和一个my_module.py在其他模块文件中被称为的模块文件。该模块my_module.py包含功能do_something_with_file(file_path)

该函数在包的其他部分中使用,但如果可以将其作为命令行脚本调用,将文件路径作为第一个位置参数并执行该函数,那么它将很实用。我的第一个天真的方法是通过以下方式实现:

if __name__ == "__main__":
    import sys
    do_something_with_file(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)

在文件中my_module.py

但这需要作为my_module.pymain 执行。但作为包的一部分,它使用相对导入,仅当模块作为包的一部分执行时才有效,但如果直接执行脚本则失败,这使得这种方法没有吸引力。看来该文件中的主块不是获得所需功能的正确方法。

将功能公开为简单脚本的良好做法是什么?

我没有使用 python 打包的经验,我通常通过执行直接使用脚本python my_script.py,但我想更好地了解包并通过包公开功能。

python python-import python-3.x python-packaging

3
推荐指数
1
解决办法
1440
查看次数

为什么python import模块导入的时候会导入*

假设我有一个要导入一些包的文件:

# myfile.py
import os
import re
import pathlib

def func(x, y):
    print(x, y)
Run Code Online (Sandbox Code Playgroud)

如果我进入另一个文件并输入

from myfile import *
Run Code Online (Sandbox Code Playgroud)

它不仅导入,还func导入os、、、、repathlib

但我希望在导入时导入这些模块import *

为什么它会导入我正在导入的其他包以及如何避免这种情况?

python import python-import

3
推荐指数
1
解决办法
1763
查看次数