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

时间:2019-07-30 10:26:37

标签: python linux subprocess

我有一个扩展名为concat的文件,例如.run。它是可执行文件,即权限级别已正确设置。

在Linux终端中,只需提交myfile.run即可执行它。

在Python 3.6中,我尝试使用./myfile.run函数执行同一文件,但未成功。 :(我试过:

subprocess.run()

我尝试过:

result = subprocess.run( ['./home/user1/myfile.run'], stdout=subprocess.PIPE )
Traceback (most recent call last):
  File "<pyshell#51>", line 1, in <module>
    result = subprocess.run( [a], stdout=subprocess.PIPE )
  File "/usr/lib/python3.6/subprocess.py", line 423, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
NotADirectoryError: [Errno 20] Not a directory: './home/user1/myfile.run'

result = subprocess.run( ['/home/user1/myfile.run'], stdout=subprocess.PIPE )

什么都没发生。

我应该使用什么正确的result = subprocess.run( '/home/user1/myfile.run', stdout=subprocess.PIPE, shell=True ) 语法?谢谢。

1 个答案:

答案 0 :(得分:1)

使用subprocess.run()执行.run可执行文件的正确语法是:

result = subprocess.run( ['/bin/bash', '/home/user1/myfile.run'], stdout=subprocess.PIPE )

本质上,.run文件是一个bash脚本,要运行我需要激活/bin/bash的bash文件。通常在终端机中运行bash脚本的.符号在subprocess.run()中不起作用。因此,/bin/bash必须明确声明。

解决了我的问题之后,我发现myfile.run bash脚本创建的数据被写入包含提交了subprocess.run()函数的python脚本的目录的子目录中。但是,这种结果是错误的。数据应已写入包含myfile.run bash脚本的目录的子目录中。这是在终端中提交./home/user1/myfile.run时的结果。

关于如何在python中更改当前工作目录的常见观点是使用函数os.chdir()(请参见here)。但是,我发现Python 3.6中的函数subprocess.run()具有当前工作目录关键字参数kwarg,称为cwd=None。因此,要解决我的错误目录问题(如上所述),我只需要将所需的工作目录与cwd等同,例如cwd='/home/user1/Project'。意思是,os.chdir()subprocess.run()函数一起使用是不必要的,并且可以避免。