【问题标题】:OSError: [Errno 13] Permission denied Python subprocess.call()OSError: [Errno 13] Permission denied Python subprocess.call()
【发布时间】:2013-09-22 05:59:49
【问题描述】:

我正在尝试在 python 中运行一个子进程,但我收到错误消息: OSError: [Errno 13] 权限被拒绝

cp2 = cp2.lstrip("~")
cp2 = wilixdirectory+"/Users/"+loggedusr+cp2 
    if cp3 == None:
    subprocess.call([cp2])
else:
    subprocess.call([cp2, cp3])

cp2 和 cp3 是目录的用户输入

wilixdirectory 是一个目录

loggedusr 是一个类似 "Bob" 或 "Joe" 的字符串

代码用完了 Unix

【问题讨论】:

  • 你能显示你的代码吗?这个是在什么环境下运行的,有什么权限?
  • 检查cp2的值。这是你所期望的吗?它是否缺少一个前导斜线,或者它是否有一个不应该存在的斜线?如果它命名一个真实文件,你是否有权访问该文件?
  • 你可以用cp2 = os.path.expanduser(cp2)代替cp2.lstrip("~"); cp2 = wilixdirectory+"/Users/"+loggedusr+cp2

标签: python subprocess


【解决方案1】:

不要假设路径以斜杠开头,并使用+ 连接,而是使用os.path.join() 创建路径:

import os.path

basepath = os.path.join(wilixdirectory, 'Users', loggedusr)
cp2 = cp2.lstrip('~/')
cp2 = os.path.abspath(os.path.join(basepath, cp2))
if not cp2.startswith(basepath + os.path.pathsep):
    # something is wrong still, the absolute final path is not inside of
    # user directory, bail now.
    raise ValueError('Not a valid command')

# Perhaps test if os.path.isfile(cp2) is True?

args = [cp2]
if cp3 is not None:
    args.append[cp3]

subprocess.call(args)

请注意,我从cp2 的开头删除~/ 以从用户输入中删除任何意外的开始字符,然后使用os.path.abspath() 确保路径是规范路径,任何./../ 条目已解决。然后您确实需要验证最终结果是否仍在用户目录中,而不是在用户目录之外。

您可以在运行subprocess.call() 之前使用os.path.isfile() 进行测试以查看cp2 路径是否实际指向实际文件。

【讨论】:

    【解决方案2】:

    解决方案:

    这适用于 Linux,但适用于 Unix:

    subprocess.call(["open","-a",cp2])
    

    对于 Windows:

    subprocess.call(["start",cp2])
    

    【讨论】:

    • 您还可以检查 webbrowser.open(cp2) 在您的情况下是否正确。
    猜你喜欢
    • 2017-07-15
    • 2020-06-21
    • 2012-06-16
    • 2016-08-07
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多