{"id":10020723,"date":"2025-04-12T09:53:31","date_gmt":"2025-04-12T01:53:31","guid":{"rendered":"https:\/\/itmax.cn\/?p=10020723"},"modified":"2025-04-12T09:53:31","modified_gmt":"2025-04-12T01:53:31","slug":"%e6%89%a7%e8%a1%8c-buildozer-v-android-debug-%e6%8a%a5%e9%94%99-valueerror-read-of-closed-file","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10020723","title":{"rendered":"\u6267\u884c buildozer -v android debug \u62a5\u9519 ValueError: read of closed file"},"content":{"rendered":"<p>\u53c2\u8003\uff1a<a href=\"https:\/\/link.segmentfault.com\/?enc=Z8SVRPGjBGvGVM91W38b8w%3D%3D.9GeEX76phQs9O0CCULVHD%2BckeBtpqEB5xOwrEKqdAtuJ7%2BgYP%2BOdm%2FSUOF5tyrl8xSdVu1imdcPKHoawGw%2BDSQ%3D%3D\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">\u89e3\u51b3buildozer\u8fd0\u884c\u4e0b\u8f7d\u4f9d\u8d56\u5305\u95ee\u9898\u201cfatal\uff1a\u65e0\u6cd5\u8bbf\u95ee\u2018https:\/\/github.com\/kivy\/python-for-android.git\u201d\u89e3\u51b3\u8fc7\u7a0b<\/a><\/p>\n<p>\u4f5c\u4e3a\ud83c\udc04\ufe0f\u56fd\u4eba\u5b9e\u5728\u662f\u592a\u60e8\u4e86\uff0c\u7f51\u7edc\u88ab\u5c01\u9501\uff0c\u4f7f\u7528 buildozer \u6253\u5305\u8fd8\u8981\u9762\u4e34\u7f51\u7edc\u5c01\u9501\u7684\u95ee\u9898<\/p>\n<pre><code class=\"log\">\u2570\u2500\u27a4  buildozer -v android debug                                                                                                 1 \u21b5\n# Check configuration tokens\n# Ensure build layout\n# Create directory \/Users\/ponponon\/Desktop\/code\/me\/ideaboom\/.buildozer\n# Create directory \/Users\/ponponon\/Desktop\/code\/me\/ideaboom\/bin\n# Create directory \/Users\/ponponon\/Desktop\/code\/me\/ideaboom\/.buildozer\/applibs\n# Create directory \/Users\/ponponon\/Desktop\/code\/me\/ideaboom\/.buildozer\/android\/platform\n# Create directory \/Users\/ponponon\/Desktop\/code\/me\/ideaboom\/.buildozer\/android\/app\n# Check configuration tokens\n# Preparing build\n# Check requirements for android\n# Search for Git (git)\n#  -&gt; found at \/opt\/homebrew\/Cellar\/git\/2.49.0\/bin\/git\n# Search for Cython (cython)\n#  -&gt; found at \/opt\/homebrew\/bin\/cython\n# Search for Java compiler (javac)\n#  -&gt; found at \/usr\/bin\/javac\n# Search for Java keytool (keytool)\n#  -&gt; found at \/usr\/bin\/keytool\n# Install platform\n# Run ['git', 'clone', '-b', 'master', '--single-branch', 'https:\/\/github.com\/kivy\/python-for-android.git', 'python-for-android']\n# Cwd \/Users\/ponponon\/Desktop\/code\/me\/ideaboom\/.buildozer\/android\/platform\nCloning into 'python-for-android'...\n# Run ['\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/bin\/python', '-m', 'pip', 'install', '-q', 'appdirs', 'colorama&gt;=0.3.3', 'jinja2', 'sh&gt;=1.10, &lt;2.0; sys_platform!=&quot;win32&quot;', 'build', 'toml', 'packaging', 'setuptools']\n# Cwd None\n# Apache ANT found at \/Users\/ponponon\/.buildozer\/android\/platform\/apache-ant-1.9.4\n# Android SDK found at \/Users\/ponponon\/.buildozer\/android\/platform\/android-sdk\n# Recommended android's NDK version by p4a is: 25b\n# Android NDK is missing, downloading\n# Downloading https:\/\/dl.google.com\/android\/repository\/android-ndk-r25b-darwin.zip\nTraceback (most recent call last):\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/bin\/buildozer&quot;, line 8, in &lt;module&gt;\n    sys.exit(main())\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/lib\/python3.10\/site-packages\/buildozer\/scripts\/client.py&quot;, line 13, in main\n    Buildozer().run_command(sys.argv[1:])\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/lib\/python3.10\/site-packages\/buildozer\/__init__.py&quot;, line 1024, in run_command\n    self.target.run_commands(args)\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/lib\/python3.10\/site-packages\/buildozer\/target.py&quot;, line 93, in run_commands\n    func(args)\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/lib\/python3.10\/site-packages\/buildozer\/target.py&quot;, line 103, in cmd_debug\n    self.buildozer.prepare_for_build()\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/lib\/python3.10\/site-packages\/buildozer\/__init__.py&quot;, line 172, in prepare_for_build\n    self.target.install_platform()\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/lib\/python3.10\/site-packages\/buildozer\/targets\/android.py&quot;, line 615, in install_platform\n    self._install_android_ndk()\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/lib\/python3.10\/site-packages\/buildozer\/targets\/android.py&quot;, line 438, in _install_android_ndk\n    self.buildozer.download(url,\n  File &quot;\/Users\/ponponon\/.local\/share\/virtualenvs\/ideaboom-B0dr_aXc\/lib\/python3.10\/site-packages\/buildozer\/__init__.py&quot;, line 658, in download\n    urlretrieve(url, filename, report_hook)\n  File &quot;\/Library\/Frameworks\/Python.framework\/Versions\/3.10\/lib\/python3.10\/urllib\/request.py&quot;, line 1848, in retrieve\n    block = fp.read(bs)\n  File &quot;\/Library\/Frameworks\/Python.framework\/Versions\/3.10\/lib\/python3.10\/tempfile.py&quot;, line 483, in func_wrapper\n    return func(*args, **kwargs)\nValueError: read of closed file<\/code><\/pre>\n<p>\u600e\u4e48\u89e3\u51b3\u5462\uff1f<\/p>\n<h2>\u5206\u6790\u95ee\u9898\u6240\u5728<\/h2>\n<p>\u9996\u5148\u6211\u662f\u6302\u4e86 t \u7684\uff0c\u6240\u4ee5\u6211\u5148\u7528 requests \u4e0b\u8f7d\u770b\u770b\uff0c\u662f\u4e0d\u662f\u53ef\u4ee5\u4e0b\u8f7d\u6210\u529f\uff0c\u770b\u770b\u662f\u5728 python \u8fd8\u662f\u5728\u7f51\u7edc<\/p>\n<pre><code class=\"python\">import urllib.request\n\nurl = &quot;https:\/\/dl.google.com\/android\/repository\/commandlinetools-mac-6514223_latest.zip&quot;\nlocal_filename = &quot;commandlinetools-mac-6514223_latest.zip&quot;\n\nurl=&quot;https:\/\/archive.apache.org\/dist\/ant\/binaries\/apache-ant-1.9.4-bin.tar.gz&quot;\nlocal_filename=&quot;apache-ant-1.9.4-bin.tar.gz&quot;\n\ntry:\n    # \u76f4\u63a5\u4e0b\u8f7d\u5e76\u4fdd\u5b58\u6587\u4ef6\n    urllib.request.urlretrieve(url, local_filename)\n    print(f&quot;\u6587\u4ef6\u5df2\u4e0b\u8f7d: {local_filename}&quot;)\nexcept urllib.error.URLError as e:\n    print(f&quot;\u4e0b\u8f7d\u5931\u8d25: {e}&quot;)\n    <\/code><\/pre>\n<p>\u53d1\u73b0\u662f\u53ef\u4ee5\u4e0b\u8f7d\u6210\u529f\u7684<\/p>\n<p>\u4f46\u662f buildozer \u4f7f\u7528\u7684\u662f urllib \u4e0b\u8f7d\u7684\uff0c\u6240\u4ee5\u95ee\u9898\u51fa\u5728 urllib \u4e0a\u5417\uff1f<\/p>\n<p>\u4e8e\u662f\u5199\u4e86\u4e00\u4e2a urllib \u7248\u672c\u7684<\/p>\n<pre><code class=\"python\">import urllib.request\n\nurl = &quot;https:\/\/dl.google.com\/android\/repository\/commandlinetools-mac-6514223_latest.zip&quot;\nlocal_filename = &quot;commandlinetools-mac-6514223_latest.zip&quot;\n\nurl=&quot;https:\/\/archive.apache.org\/dist\/ant\/binaries\/apache-ant-1.9.4-bin.tar.gz&quot;\nlocal_filename=&quot;apache-ant-1.9.4-bin.tar.gz&quot;\n\ntry:\n    # \u76f4\u63a5\u4e0b\u8f7d\u5e76\u4fdd\u5b58\u6587\u4ef6\n    urllib.request.urlretrieve(url, local_filename)\n    print(f&quot;\u6587\u4ef6\u5df2\u4e0b\u8f7d: {local_filename}&quot;)\nexcept urllib.error.URLError as e:\n    print(f&quot;\u4e0b\u8f7d\u5931\u8d25: {e}&quot;)<\/code><\/pre>\n<p>\u53d1\u73b0\u4e5f\u662f\u53ef\u4ee5\u6b63\u5e38\u4e0b\u8f7d\u7684<\/p>\n<p>\u90a3\u95ee\u9898\u5728\u4e8e buildozer \u5bf9 urllib \u7684\u4f7f\u7528\u65b9\u5f0f\u4e86<\/p>\n<p>\u6240\u4ee5\u6df1\u5165\u6252\u4e00\u4e0b buildozer \u7684\u6e90\u4ee3\u7801<\/p>\n<p>\u53d1\u73b0 buildozer \u662f\u4f7f\u7528 urlib \u7684 FancyURLopener.retrieve \u4e0b\u8f7d\u7684<\/p>\n<pre><code class=\"python\">class ChromeDownloader(FancyURLopener):\n    version = (\n        'Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 '\n        '(KHTML, like Gecko) Chrome\/28.0.1500.71 Safari\/537.36')\n\n\nurlretrieve = ChromeDownloader().retrieve<\/code><\/pre>\n<p>\u5173\u4e8e FancyURLopener.retrieve \u548c\u76f4\u63a5\u4f7f\u7528 urllib.request.urlretrieve \u7684\u533a\u522b\uff0c\u6211\u95ee\u4e86\u4e00\u4e0b ai<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"723\" height=\"233\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVdiYhw\" alt=\"\u56fe\u7247.png\" title=\"\u56fe\u7247.png\"><\/p>\n<blockquote><p>\u4f60\u4ee3\u7801\u7684\u95ee\u9898\uff0c\u6838\u5fc3\u539f\u56e0\u8fd8\u662f\u51fa\u5728 FancyURLopener().retrieve \u662f\u8fc7\u65f6\u7684\u8001\u65b9\u6cd5\uff0c\u5b83\u5185\u90e8\u5bf9\u4e34\u65f6\u6587\u4ef6\uff08\u6bd4\u5982 tempfile\uff09\u7684\u5904\u7406\u65b9\u5f0f\u4e0d\u518d\u9002\u7528\u4e8e\u73b0\u4ee3 Python \u7684\u6587\u4ef6\u6d41\u673a\u5236\uff0c\u5bfc\u81f4<\/p><\/blockquote>\n<p>\u6240\u4ee5\u628a buildozer \u91cc\u9762\u7684 retrieve \u6362\u4e00\u4e0b\u5c31\u884c\uff1f\u6211\u9a8c\u8bc1\u4e00\u4e0b<\/p>\n<blockquote><p>\u6587\u4ef6\u8def\u5f84 <code>site-packages\/buildozer\/__init__.py<\/code><\/p><\/blockquote>\n<p><img decoding=\"async\" width=\"723\" height=\"173\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVdiYil\" alt=\"\u56fe\u7247.png\" title=\"\u56fe\u7247.png\" loading=\"lazy\"><\/p>\n<p>\u7ed3\u679c\u5c31\u53ef\u4ee5\u4e86<\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"109\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVdiYim\" alt=\"\u56fe\u7247.png\" title=\"\u56fe\u7247.png\" loading=\"lazy\"><\/p>\n<p>\u5b89\u88c5\u5b8c\u6210\u4e4b\u540e\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"shell\">\u2570\u2500\u27a4  tree -L 4 ~\/.buildozer                                                                                                                    \n\/Users\/ponponon\/.buildozer\n\u251c\u2500\u2500 android\n\u2502   \u2514\u2500\u2500 platform\n\u2502       \u251c\u2500\u2500 android\n\u2502       \u2502   \u2514\u2500\u2500 platform\n\u2502       \u251c\u2500\u2500 android-ndk-r25b\n\u2502       \u2502   \u251c\u2500\u2500 build\n\u2502       \u2502   \u251c\u2500\u2500 CHANGELOG.md\n\u2502       \u2502   \u251c\u2500\u2500 meta\n\u2502       \u2502   \u251c\u2500\u2500 ndk-build\n\u2502       \u2502   \u251c\u2500\u2500 ndk-gdb\n\u2502       \u2502   \u251c\u2500\u2500 ndk-lldb\n\u2502       \u2502   \u251c\u2500\u2500 ndk-stack\n\u2502       \u2502   \u251c\u2500\u2500 ndk-which\n\u2502       \u2502   \u251c\u2500\u2500 NOTICE\n\u2502       \u2502   \u251c\u2500\u2500 NOTICE.toolchain\n\u2502       \u2502   \u251c\u2500\u2500 prebuilt\n\u2502       \u2502   \u251c\u2500\u2500 python-packages\n\u2502       \u2502   \u251c\u2500\u2500 README.md\n\u2502       \u2502   \u251c\u2500\u2500 shader-tools\n\u2502       \u2502   \u251c\u2500\u2500 simpleperf\n\u2502       \u2502   \u251c\u2500\u2500 source.properties\n\u2502       \u2502   \u251c\u2500\u2500 sources\n\u2502       \u2502   \u251c\u2500\u2500 toolchains\n\u2502       \u2502   \u2514\u2500\u2500 wrap.sh\n\u2502       \u251c\u2500\u2500 android-ndk-r25b-darwin.zip\n\u2502       \u251c\u2500\u2500 android-sdk\n\u2502       \u2502   \u251c\u2500\u2500 build-tools\n\u2502       \u2502   \u251c\u2500\u2500 commandlinetools-mac-6514223_latest.zip\n\u2502       \u2502   \u251c\u2500\u2500 licenses\n\u2502       \u2502   \u251c\u2500\u2500 platform-tools\n\u2502       \u2502   \u2514\u2500\u2500 tools\n\u2502       \u2514\u2500\u2500 apache-ant-1.9.4\n\u2502           \u251c\u2500\u2500 apache-ant-1.9.4\n\u2502           \u2514\u2500\u2500 apache-ant-1.9.4-bin.tar.gz\n\u2514\u2500\u2500 cache<\/code><\/pre>\n<blockquote><p>\u9898\u5916\u8bdd\uff1a\u300c\u4f7f\u7528 FancyURLopener \u6709\u4ec0\u4e48\u597d\u5904\uff1f\u4e3a\u4ec0\u4e48 buildozer \u4e0d\u76f4\u63a5\u4f7f\u7528 urllib.request.urlretrieve \u800c\u662f\u8981\u7528 FancyURLopener\uff1f\u300d\u60f3\u77e5\u9053\u53ef\u4ee5\u53bb\u95ee AI<\/p><\/blockquote>\n<p>\u7136\u540e\uff0cbuildozer \u5df2\u7ecf\u505c\u6b62\u66f4\u65b0\u4e86\uff0c\u5efa\u8bae\u6362\u4e00\u4e2a\u6253\u5305\u5de5\u5177\u4e86<\/p>\n<p><a href=\"https:\/\/link.segmentfault.com\/?enc=bnIbAK4gnDb8%2BQ3KqnzNzA%3D%3D.dHSk01WamRpGIcojCUEDgqLytR2cdLoj19E9EEJwh1wxHo16Jq%2FDHY%2Fq%2FU96C6hR\" rel=\"nofollow noopener noreferrer\" target=\"_blank\">https:\/\/pypi.org\/project\/buildozer\/#history<\/a><\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"181\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVdiYjR\" alt=\"\u56fe\u7247.png\" title=\"\u56fe\u7247.png\" loading=\"lazy\"><\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000046426981\">https:\/\/segmentfault.com\/a\/1190000046426981<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u53c2\u8003\uff1a\u89e3\u51b3buildozer\u8fd0\u884c\u4e0b\u8f7d\u4f9d\u8d56\u5305\u95ee\u9898\u201cfatal\uff1a\u65e0\u6cd5\u8bbf\u95ee\u2018https:\/\/github.com\/k [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10020723","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10020723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10020723"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10020723\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10020723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10020723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10020723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}