【问题标题】:Python subprocess permissionerrorPython子进程权限错误
【发布时间】:2021-12-10 11:26:39
【问题描述】:

当我尝试执行位于 Program Files 目录中的文件时,我收到 PermissionError execption。

excat 错误

Traceback (most recent call last):
  File "Build.py", line 24, in <module>
    subprocess.Popen([buildCMD], stdin=subprocess.PIPE)
  File "subprocess.py", line 854, in __init__
  File "subprocess.py", line 1307, in _execute_child
PermissionError: [WinError 5] Zugriff verweigert
[23948] Failed to execute script 'Build' due to unhandled exception!

代码:

import subprocess
buildCMD = '"C:/Program Files/Microchip/xc8/v2.32/bin/xc8-cc.exe" -mcpu=16f1787 -Wl,-Map=.build/main.build.map  -DXPRJ_default=default  -Wl,--defsym=__MPLAB_BUILD=1   -mdfp=C:/Program Files/Microchip/MPLABX/v5.50/packs/Microchip/PIC12-16F1xxx_DFP/1.2.63/xc8  -fno-short-double -fno-short-float -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file  -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -Wl,--memorysummary,.build/memoryfile.xml -o .build/main.build.hex main.c'

subprocess.Popen([buildCMD], stdin=subprocess.PIPE)

【问题讨论】:

  • 你在linux上吗?
  • 不,我现在在 Windows 上。否则我可以用 chmod +x 修复它
  • 检查路径是否正确,或者使用原始字符串可能会有所帮助r''
  • @TTT2 这是正确的路径,但可能“程序文件”中的空间有问题。不应该,因为我在路径中使用了双引号。
  • 您没有在另一条带有空格的路径周围使用双引号。也许重新加载页面,这样你就可以看到我的答案了。

标签: python python-3.x permissionerror


【解决方案1】:

将字符串作为列表传递是双重错误的,尽管这里的 Windows 比真正的计算机更宽容。你想要一个

subprocess.run([
    "C:/Program Files/Microchip/xc8/v2.32/bin/xc8-cc.exe",
    "-mcpu=16f1787", "-Wl,-Map=.build/main.build.map",
    "-DXPRJ_default=default", "-Wl,--defsym=__MPLAB_BUILD=1",
    "-mdfp=C:/Program Files/Microchip/MPLABX/v5.50/packs/Microchip/PIC12-16F1xxx_DFP/1.2.63/xc8",
    "-fno-short-double", "-fno-short-float", "-fasmfile",
    "-maddrqual=ignore", "-xassembler-with-cpp", "-mwarn=-3",
    "-Wa,-a", "-msummary=-psect,-class,+mem,-hex,-file",
    "-ginhx32", "-Wl,--data-init", "-mno-keep-startup",
    "-mno-osccal", "-mno-resetbits", "-mno-save-resetbits",
    "-mno-download", "-mno-stackcall", "-std=c99", "-gdwarf-3",
    "-mstack=compiled:auto:auto",
    "-Wl,--memorysummary,.build/memoryfile.xml",
    "-o", ".build/main.build.hex", "main.c"],
    stdin=subprocess.PIPE,
    check=True)

或与字符串相同(但在参数周围正确引用,其中包含空格,特别是-mdfp=C:/Program Files/...)和shell=True(但是you usually want to avoid.)

还要注意添加 check=True 以在子进程失败时让 Python 引发异常,并且优先使用 subprocess.run() 而不是 subprocess.Popen 除非您特别要求子进程与您的 Python 脚本一起运行,然后提交管理进程对象直到它被终止。

【讨论】:

  • 里面有逗号的选项看起来很奇怪,但我想你知道你在那里做什么。
猜你喜欢
  • 2018-10-02
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2016-06-17
  • 2012-03-29
  • 2010-10-26
相关资源
最近更新 更多