我有一个扩展名为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 )
语法?谢谢。
答案 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()
函数一起使用是不必要的,并且可以避免。