如何在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并打印,就能明确程序是执行成功无输出,还是遇到了问题。
最后再确认两个细节:
- 确保
/home/user1/myfile.run存在且有可执行权限:终端执行ls -l /home/user1/myfile.run,看权限列是否包含x(比如-rwxr-xr-x)。 - 如果该
.run文件需要图形界面或交互输入,可能需要额外设置(比如start_new_session=True或处理stdin),但普通的.run安装包用上面的方法就能正常执行。
内容的提问来源于stack exchange,提问作者Sun Bear
相关产品推荐
相关产品推荐

