- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在做一个需要 youtube-dl 才能在 kivy 环境中工作的小项目。我有 python 3.8.3、Kivy 1.11.1、youtube-dl 2020.5.8。除了这个问题,kivy 在 python3.8 上运行良好。
我在尝试使用 youtube-dl 获取有关 youtube 视频的信息时收到此错误 AttributeError: 'str' object has no attribute 'write'
它确实适用于少数链接,但不适用于许多其他链接。
此错误已出现在 youtube-dl 的 github 页面 [[此处]][1] 上,但我找不到任何解决方案。
以下是两个具有可重现示例的案例。
案例一
import youtube_dl
from kivy.app import App
from kivy.uix.button import Button
class MusicApp(App):
def build(self):
return Button(text='Example')
ydl_opts = {
'outtmpl': '%(title)s.%(ext)s',
'audio-format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])
输出
[INFO ] [Logger ] Record log in /home/adarsh/.kivy/logs/kivy_20-06-23_1.txt
[INFO ] [Kivy ] v1.11.1
[INFO ] [Kivy ] Installed at "/usr/local/lib/python3.8/dist-packages/kivy/__init__.py"
[INFO ] [Python ] v3.8.2 (default, Apr 27 2020, 15:53:34)
[GCC 9.3.0]
[INFO ] [Python ] Interpreter at "/usr/bin/python3"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO ] [Text ] Provider: sdl2(['text_pango'] ignored)
[youtube] BaW_jenozKc: Downloading webpage
[download] Resuming download at byte 215799
[download] Destination: youtube-dl test video ''_ä↭𝕐.f137.mp4
[download] 100% of 2.11MiB in 00:07.90KiB/s ETA 00:00
[download] Destination: youtube-dl test video ''_ä↭𝕐.f140.m4a
[download] 100% of 154.06KiB in 00:00.07KiB/s ETA 00:00
[ffmpeg] Merging formats into "youtube-dl test video ''_ä↭𝕐.mp4"
Deleting original file youtube-dl test video ''_ä↭𝕐.f137.mp4 (pass -k to keep)
Deleting original file youtube-dl test video ''_ä↭𝕐.f140.m4a (pass -k to keep)
[ffmpeg] Destination: youtube-dl test video ''_ä↭𝕐.mp3
Deleting original file youtube-dl test video ''_ä↭𝕐.mp4 (pass -k to keep)
案例二
import youtube_dl
from kivy.app import App
from kivy.uix.button import Button
class MusicApp(App):
def build(self):
return Button(text='Example')
ydl_opts = {
'outtmpl': '%(title)s.%(ext)s',
'audio-format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v=nTj4wVJAbNg'])
输出
[INFO ] [Logger ] Record log in /home/adarsh/.kivy/logs/kivy_20-06-23_2.txt
[INFO ] [Kivy ] v1.11.1
[INFO ] [Kivy ] Installed at "/usr/local/lib/python3.8/dist-packages/kivy/__init__.py"
[INFO ] [Python ] v3.8.2 (default, Apr 27 2020, 15:53:34)
[GCC 9.3.0]
[INFO ] [Python ] Interpreter at "/usr/bin/python3"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO ] [Text ] Provider: sdl2(['text_pango'] ignored)
[youtube] nTj4wVJAbNg: Downloading webpage
Traceback (most recent call last):
File "temp/tmp.py", line 21, in <module>
ydl.download(['https://www.youtube.com/watch?v=nTj4wVJAbNg'])
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py", line 2018, in download
res = self.extract_info(
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py", line 808, in extract_info
return self.process_ie_result(ie_result, download, extra_info)
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py", line 863, in process_ie_result
return self.process_video_result(ie_result, download=download)
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py", line 1644, in process_video_result
self.process_info(new_info)
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py", line 1902, in process_info
self.report_warning(
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py", line 613, in report_warning
self.to_stderr(warning_message)
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py", line 527, in to_stderr
self._write_string(output, self._err_file)
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py", line 506, in _write_string
write_string(s, out=out, encoding=self.params.get('encoding'))
File "/home/adarsh/.local/lib/python3.8/site-packages/youtube_dl/utils.py", line 3174, in write_string
out.buffer.write(byt)
AttributeError: 'str' object has no attribute 'write'
即使有一些解决方法,也请提出建议。
编辑:我将记录器传递给了从他们的 github 页面获取的 youtube-dl
class MyLogger(object):
def debug(self, msg):
print("DEBUG " + msg)
pass
def warning(self, msg):
print("WARNING " + msg)
pass
def error(self, msg):
print("ERROR " + msg)
我需要稍后编写自己的记录器来获取下载进度。所以我要使用这个解决方案。[1]: https://github.com/ytdl-org/youtube-dl/issues/22109
最佳答案
我正在做一个类似的项目,但遇到了同样的错误。
我捕获异常并打印回溯
import traceback
...
try:
with youtube_dl.YoutubeDL(self.ydl_opts) as ydl:
ydl.download([self.url])
except Exception as inst:
print(inst)
tb = traceback.format_exc()
print(tb)
pass
我得到了这个:
'str' object has no attribute 'write'
Traceback (most recent call last):
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/YoutubeDL.py", line 797, in extract_info
ie_result = ie.extract(url)
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/extractor/common.py", line 530, in extract
ie_result = self._real_extract(url)
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/extractor/generic.py", line 2277, in _real_extract
% (url, url), expected=True)
youtube_dl.utils.ExtractorError: 'qsd' is not a valid URL. Set --default-search "ytsearch" (or run youtube-dl "ytsearch:qsd" ) to search YouTube
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "src/main.py", line 81, in run
download_retcode = ydl.download([self.url])
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/YoutubeDL.py", line 2019, in download
url, force_generic_extractor=self.params.get('force_generic_extractor', False))
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/YoutubeDL.py", line 820, in extract_info
self.report_error(compat_str(e), e.format_traceback())
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/YoutubeDL.py", line 625, in report_error
self.trouble(error_message, tb)
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/YoutubeDL.py", line 578, in trouble
self.to_stderr(message)
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/YoutubeDL.py", line 527, in to_stderr
self._write_string(output, self._err_file)
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/YoutubeDL.py", line 506, in _write_string
write_string(s, out=out, encoding=self.params.get('encoding'))
File "/home/odrevet/.local/lib/python3.6/site-packages/youtube_dl/utils.py", line 3180, in write_string
out.buffer.write(byt)
AttributeError: 'str' object has no attribute 'write'
通过查看堆栈中函数的名称,我们可以看到当 ytdl 尝试报告另一个错误时我们的错误发生了(在这种情况下:“youtube_dl.utils.ExtractorError:‘qsd’不是有效的 URL”,因为我在我的程序中输入了“qsd”而不是有效的 url)。
通过查看 YoutubeDl.py 中的 to_stderr 函数,我们可以看到 out 应该是 sys.stderr,而在 utils.py 中发生错误的函数中:
def write_string(s, out=None, encoding=None):
print(type(out)) # I added this line
if out is None:
out = sys.stderr
assert type(s) == compat_str
if sys.platform == 'win32' and encoding is None and hasattr(out, 'fileno'):
if _windows_write_string(s, out):
return
if ('b' in getattr(out, 'mode', '')
or sys.version_info[0] < 3): # Python 2 lies about mode of sys.stderr
byt = s.encode(encoding or preferredencoding(), 'ignore')
out.write(byt)
elif hasattr(out, 'buffer'):
enc = encoding or getattr(out, 'encoding', None) or preferredencoding()
byt = s.encode(enc, 'ignore')
out.buffer.write(byt) # Error on line 3180
else:
out.write(s)
out.flush()
根据 hasattr elif 检查,stderr 有一个缓冲区属性,问题是 Kivy 如何处理错误流。根据我在 write_string 中添加的打印,stderr 被重新定义为一个
参见 https://kivy.org/doc/stable/_modules/kivy/logger.html
class LogFile(object):
def __init__(self, channel, func):
self.buffer = '' # <-- a str
self.func = func
self.channel = channel
self.errors = ''
我不知道是否可以通过参数化 kivy 来为 stderr 使用标准流,但我会检查一下。同时捕获异常并打印回溯以至少在“处理上述异常期间,发生另一个异常”之前有原始错误
编辑:您可以将 stderr 重定向到一个文件
sys.stderr = open('./stderr', 'w')
关于python-3.x - AttributeError : 'str' object has no attribute 'write' , youtube-dl kivy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62525458/
所以我有一个类似这样的 dl 列表: .title { display: inline-block; padding-bottom: 20px; } dd { -moz-margin-st
我想使用代理并运行它youtube-dl --proxy socks5://127.0.0.1:1080 这是下面的错误 Usage: youtube-dl [OPTIONS] URL [URL...
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
[Windows 10] 我有一个包含 128 个项目的视频播放列表 URL,我已经从同一个播放列表 URL 下载了 25 个视频。现在我想从 26 索引开始下载剩余的视频,但我无法使用 --paly
我正在使用 youtube-dl 从 youtube 下载播放列表。我使用自动编号功能对视频进行编号,这可以通过格式化输出文件的名称来实现,如下 -o "%(autonumber)s-%(title)
我正在显示 的列表tags 我页面中的标签。我想要 当标签的内容足够长以超出 的高度时不换行. 什么 css 可以防止这种情况发生? 最佳答案 我会使用 margin-left在 上等于 的宽
此命令下载视频并将自动生成的 youtube 字幕嵌入到文件中 youtube-dl.exe -ci -f "bestvideo[ext=mp4]"+"bestaudio[ext=m4a]" --wr
我在fedora 116上使用gcc/g++,我的想法是: c program -> load c++ dynamic library A -> load c++ dynamic library B
嗯,我可以在终端中使用它直接获取视频格式 - $ youtube-dl -F "some youtube url" 输出: [youtube] Setting language [youtube] P
我的 youtube-dl 库 ( https://rg3.github.io/youtube-dl/ ) 有问题。我使用 youtube-dl 不是通过这个库直接下载视频,而是我首先使用这样的命令生
关闭。这个问题需要details or clarity .它目前不接受答案。 想要改进这个问题吗? 通过 editing this post 添加详细信息并澄清问题. 关闭 8 年前。 Improve
我是 Android Studio 的新手,每次我尝试将项目与 gradle 同步时都会收到此错误。例如,我提供了对三个文件的引用。 1)项目级build.gradle文件 plugins {
更新 Gradle 后出现以下问题。我找不到任何解决方案。所以请帮我解决以下问题。提前致谢... (问题 ----- 无法获取“https://dl.google.com/dl/android/mav
我最近开始使用 react native,但是根据伊朗人的制裁,gradle 不能构建我的第一个项目,所以我使用了 VPN 和 shecan service但我收到以下错误: 我阅读了 React n
在Firebase身份验证(助手)中使用将Firebase身份验证添加到您的应用程序时出错。 该错误在“同步”标签中显示为: Could not GET 'https://dl.google.com/
我无法在 Android Studio 中构建项目,并且收到以下错误。 Gradle 同步失败。 无法获取“https://dl.google.com/dl/android/maven2/com/an
我正在尝试将 youtube 视频保存为我的下载文件夹中的 MP3。但是,这最终会将文件保存在与 youtube-dl 相同的目录中。 youtube-dl --extract-audio --aud
我正在使用 youtube-dl用于从 YouTube 下载视频。但是在我的办公室,互联网会每隔 20Mb 断开一次。的下载。 [错误:连接被远程服务器强行关闭]。 我必须再次输入 URL 才能继续下
好的,我知道要在您使用的python程序中从Youtube-DL获取Mp3文件 from __future__ import unicode_literals import youtube_dl yd
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我是一名优秀的程序员,十分优秀!