【问题标题】:is there a way to use shell script inside python with subprocess.call()有没有办法在 python 中使用带有 subprocess.call() 的 shell 脚本
【发布时间】:2020-02-25 21:02:36
【问题描述】:

我在下面找不到此问题代码的解决方案:

import subprocess
subprocess.call(['./eu_presun.sh'])

shell 脚本与 main.py 在同一个目录中我将使用 python 然后我想使用这个 shell 脚本 我收到了这个错误。

Traceback (most recent call last):
  File "~/_main.py", line 304, in <module>
    subprocess.call(['sh eu_presun.sh'])
  File "/usr/lib/python3.8/subprocess.py", line 340, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: './eu_presun.sh'

【问题讨论】:

  • 补充:python脚本完美运行,shell脚本也完美运行-rwxr-xr-x 1 ################### eu_presun.sh
  • 它可能会单独工作当你从 shell 调用它时,但是如果它在没有 Python 的 shell 的情况下失败,它也会在很多其他情况下失败。解决真正的问题,不要只是通过显式启动 shell 来解决它。
  • 举个例子,尝试运行echo . | xargs -n 1 ./eu_presun.sh——如果有问题意味着操作系统不能成功地将eu_presun.sh作为可执行文件运行,那也会失败。 (如果它没有失败,那么这告诉我们我们的问题只是关于您在 Python 中的 os.getcwd() 不是 shell 脚本实际所在的目录)。
  • 我不明白这种追溯是如何实现的。为什么它说~/_main.py 而不是/home/you/_main.py?怎么从第三行的'sh eu_presun.sh'到最后一行的'./eu_presun.sh'

标签: python-3.x shell subprocess


【解决方案1】:

好吧,我有点累了 答案是

subprocess.call(['./eu_presun.sh']**,shell=True**)

我也有这个地址的问题,我不得不添加完整路径

【讨论】:

  • 如果您的脚本不可执行,这只是一个答案。由于您显示+x 权限是正确的,因此它可能没有有效的shebang(第一行如#!/bin/sh#!/usr/bin/env bash,适用于实际编写运行的任何shell)?还可以想象,还有其他操作系统设置/权限会影响执行(noexec 挂载点或 SELinux 策略等等——尽管所有这些都比无效的 shebang 更罕见/更不可能)。
  • 重点是,您的操作系统可以作为可执行文件成功调用的脚本不需要shell=True 来运行。 shell=True 唯一一次“修复”任何事情是权限或 shebang 是否被破坏,因为如果操作系统说,一些 shell(不是全部!)会退回到尝试在同一个解释器的另一个副本中运行某些东西execve()(启动外部进程的正确/正确方式)不起作用。
猜你喜欢
  • 2023-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2020-09-30
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多