如何使用 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 版本

如何使用 PyQt5 和 python 3.6 将 .ui 文件转换为 .py 文件

Python 3.6:如何使用 unicode/utf-8 文件名保存文件? [关闭]