【问题标题】:making a file executable via subprocess in python通过python中的子进程使文件可执行
【发布时间】:2019-04-16 18:43:32
【问题描述】:

我正在尝试通过 python 程序使 bash 文件可执行。现在它看起来像这样:

p = subprocess.Popen(chmod u+x, bashName)

bashName 是我正在执行的 bash 文件的名称,我收到错误消息:

FileNotFoundError: [Errno 2] 没有这样的文件或目录:'chmod u+x /home/#####/Desktop/music/addSong/bashFileName'

我试过了,效果也好不到哪里去

subprocess.call('chmod u+x /home/stoplight25/Desktop/music/addSong/'+bashName)

我已经尝试阅读subprocess 上的文档,但这有点超出我的理解。有人可以解释如何使用subprocess 使文件可执行。

预期:

  • 使用正确的内容和名称创建一个新的 bash 文件,使其可执行

结果:

  • 具有正确内容和名称但不可执行的 bash 文件。

【问题讨论】:

  • 将参数作为 list 传递或使用 os.chmod

标签: python bash subprocess


【解决方案1】:

您必须将参数作为 list 传递,而不是作为字符串传递,否则 python 会尝试将带有空格 & args & all 的整个字符串作为可执行文件传递给系统(或使用shell=True我不推荐)。还要检查返回码以防万一:

subprocess.check_call(['chmod','u+x','/home/stoplight25/Desktop/music/addSong/'+bashName])

或者您可以使用纯python访问文件权限(获取文件当前权限,添加用户执行掩码,应用os.chmod):

import os

my_file = os.path.join('/home/stoplight25/Desktop/music/addSong',bashName)
new_mode = os.stat(my_file).st_mode | 0o100
os.chmod(my_file,new_mode)

【讨论】:

    【解决方案2】:

    这应该可行:

    import subprocess
    command = 'chmod u+x /home/stoplight25/Desktop/music/addSong/' + bashName
    process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
    output, error = process.communicate()
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2020-05-19
    • 2019-02-16
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多