假设我们有以下结构:
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?
我为不同的环境创建了“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 提供的设置对象。
解决这个问题的方法有哪些?是否有一个设置文件用作导入模块的依赖项注入容器,并由相同的模块导入?最好是一个简单的解决方案。
我有一些想要在应用程序中使用的自定义 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 …
我正在尝试将 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 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 分发包,该导入包具有多个模块(一个文件夹,多个文件)。该包具有在模块中导入的依赖项。当用户从导入包导入模块时,他们还可以访问在函数外部导入的依赖项。我已经找到了解决方法,但我不确定这是否是一个好主意。
from markdown import markdown
def joke():
return markdown("The Funniest Joke in the World")
Run Code Online (Sandbox Code Playgroud)
def joke():
from markdown import markdown
return markdown("The Funniest Joke in the World")
Run Code Online (Sandbox Code Playgroud)
>>> 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)
>>> import joke
>>> dir(joke)
['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__file__', '__cached__', '__builtins__', 'joke', 'markdown']
>>> joke.markdown("Not …Run Code Online (Sandbox Code Playgroud) 我正在制作一个实用程序,其中内置了多个程序,但我对程序进行了一些更改,以便在用户提示时重新运行,然后由于某种原因,我面临错误
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) 我正在使用带有 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 。
假设我有一个名为 的包文件夹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,但我想更好地了解包并通过包公开功能。
假设我有一个要导入一些包的文件:
# 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 ×10
python ×8
python-3.x ×5
import ×3
ansi ×1
apache-spark ×1
pyqt ×1
pyqt5 ×1
pyspark ×1
pytest ×1
settings ×1
syntax-error ×1
utf-8 ×1