【问题标题】:Python running bash script and generate OSErrorPython 运行 bash 脚本并生成 OSError
【发布时间】:2013-12-14 02:34:50
【问题描述】:

我有一个 bash 脚本,它可以帮助建立一个本地 SimpleHTTPServer

python -m SimpleHTTPServer 8080

我已将它放在我的项目文件夹中。当我使用以下方式运行程序时:

subprocess.call('./setup.sh')

出现错误消息:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    subprocess.call('./setup.sh')
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 709, in __init__
    errread, errwrite)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1326, in _execute_child
    raise child_exception
OSError: [Errno 13] Permission denied

我在终端重试了这个

localhost:Desktop XXXX$ sh setup.sh
Serving HTTP on 0.0.0.0 port 8080 ...

它工作正常。 我记得有几次终端弹出一个窗口,询问我有关防火墙的python权限,我允许了。你能帮帮我吗?

【问题讨论】:

  • 您可能需要在setup.sh 上设置可执行位。
  • 以 root 身份运行 (sudo)

标签: python bash simplehttpserver


【解决方案1】:

完全像在 shell 上那样运行它,即 sh ./setup.sh:

subprocess.call('sh ./setup.sh', shell=True)

这应该可以解决问题。很可能,您的 setup.sh 未设置为可执行文件,或者缺少标记其解释器的第一行 #!

编辑:

确保将shell=True 设置为通过shell 执行它,如果您将它作为单个字符串传递,或者将参数分隔到一个列表中,就像您可能使用execve 一样:

subprocess.call(['sh', './setup.sh'])

【讨论】:

  • 我试过了,但是它说 OSError: [Errno 2] No such file or directory
  • 设置shell=True,在这种情况下。这将要求 Python 通过你的 shell 执行命令(它基本上与 os.system() 相同。)或者显式地将 'sh' 和列表中的参数分开。
  • 是的,现在它工作正常。但是,我注意到 python 一直在运行。这是否意味着在执行此操作时我不能继续前进?
  • 如果你想要一个单独的进程,使用subprocess.Popen而不是subprocess.call
【解决方案2】:

试试subprocess.Popen(),使用 cwd 参数:

subprocess.Popen(['sh', './setup.sh'], cwd='/dir/contains/setup.sh/')

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 2017-01-11
    • 2021-11-30
    • 2021-07-13
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多