You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linux系统中使用Python 3.6的subprocess.run()执行.run文件

咱们先拆解问题,一步步解决:

首先,你第一个写法里的路径./home/user1/myfile.run是错误的!./代表当前工作目录,这么写相当于找当前目录下的home/user1/myfile.run,而系统的/home是根目录下的,自然会报NotADirectoryError。

你后来尝试的绝对路径写法其实是正确的,但你说“无反应”,大概率是因为没查看捕获到的输出或错误信息。下面给出正确的用法,同时帮你排查问题:

方法1:不使用Shell(推荐,更安全)

这种方式无需启用Shell,直接把可执行文件的绝对路径作为列表元素传递,同时建议捕获stderr,能看到程序执行时的错误输出:

import subprocess

try:
    result = subprocess.run(
        ['/home/user1/myfile.run'],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True,  # Python3.6+支持,让输出以字符串形式返回(替代旧的universal_newlines=True)
        check=False  # 设置为True时,程序返回非0码会直接抛出异常
    )
    
    # 打印输出和错误,确认程序执行状态
    print("程序标准输出:")
    print(result.stdout)
    print("\n程序错误输出:")
    print(result.stderr)
    print(f"\n程序返回码:{result.returncode}")
except Exception as e:
    print(f"执行时出现异常:{str(e)}")

方法2:使用Shell=True

如果确实需要通过Shell执行(比如路径含特殊字符,你的场景其实不需要),写法如下:

import subprocess

result = subprocess.run(
    '/home/user1/myfile.run',
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    shell=True,
    text=True
)

# 查看输出和错误
print("STDOUT:", result.stdout)
print("STDERR:", result.stderr)

为什么之前的写法看起来“无反应”?

你之前只捕获了stdout,如果程序没有输出到标准输出,或者错误信息输出到stderr但你没捕获,就会误以为“没反应”。加上stderr=subprocess.PIPE并打印,就能明确程序是执行成功无输出,还是遇到了问题。

最后再确认两个细节:

  1. 确保/home/user1/myfile.run存在且有可执行权限:终端执行ls -l /home/user1/myfile.run,看权限列是否包含x(比如-rwxr-xr-x)。
  2. 如果该.run文件需要图形界面或交互输入,可能需要额外设置(比如start_new_session=True或处理stdin),但普通的.run安装包用上面的方法就能正常执行。

内容的提问来源于stack exchange,提问作者Sun Bear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:35:55