如何使用 Python 3.6 的 subprocess.run() 在 Linux OS 中执行 .run 文件 [重复]
Posted
技术标签:
【中文标题】如何使用 Python 3.6 的 subprocess.run() 在 Linux OS 中执行 .run 文件 [重复]【英文标题】:How to use Python 3.6's subprocess.run() to execute a .run file in Linux OS [duplicate] 【发布时间】:2019-12-07 17:20:40 【问题描述】:我有一个扩展名为 .run
的文件,例如myfile.run
。它是可执行的,即权限级别已正确设置。
在Linux终端中,我只需提交./myfile.run
即可执行。
在 Python 3.6 中,我尝试使用 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 )
什么都没发生。
我应该使用什么正确的subprocess.run()
语法?谢谢。
【问题讨论】:
“什么都没发生”是什么意思?myfile.run
输出的东西,你检查过result
吗?
@wizzwizz4 没有错误消息。该文件假设将一堆文件复制/安装到另一个目录。但什么都没发生?
os.stat(path) 说什么?
@wizzwizz4 How do I change directory cd in Python? 上的解决方案已过时。 Python 3.6 中的 subprocess.run()
具有 cwd
关键字参数。因此,不需要os.chdir()
命令来解决错误的目录问题。正确的做法是设置 subprocess.run()
的 cwd
关键字参数的值。感谢您删除您的评论,即这是一个重复的问题,因为它不是。
shebang 将位于您尝试在子进程中运行的 Bash 脚本的顶部。这是基本的 Unix 101,所以它确实已经被覆盖了数百次。
【参考方案1】:
使用subprocess.run()
执行.run
可执行文件的正确语法是:
result = subprocess.run( ['/bin/bash', '/home/user1/myfile.run'], stdout=subprocess.PIPE )
本质上,.run
文件是一个 bash 脚本,要运行一个 bash 文件,我需要激活 /bin/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()
函数的使用是不必要的,并且是避免的。
【讨论】:
以上是关于如何使用 Python 3.6 的 subprocess.run() 在 Linux OS 中执行 .run 文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 virtualenv 在 Amazon 的 Elastic Beanstalk 上使用最新版本的 python (3.6)
如何使用scipy 1.0.0计算python 3.6中的VIF?
如何提高 Python 3.6 中的 SQLite 插入性能?
详解如何在 Linux 中安装最新的 Python 3.6 版本