无法通过 Pexpect 从不同的目录启动程序

Can't launch a program from a different directory via Pexpect

我无法通过 Pexpect 模块启动简单的 HelloWorld 程序。 我有一个包含 HelloWorld 二进制文件的目录 - hw,期望脚本 - m.py,以及一个包含相同脚本的目录。

├── hw
├── m.py
├── main.cpp
└── dir
    └── m.py

这是我的期望脚本:

import pexpect
child = pexpect.spawn("./hw", cwd = /absolute/path/to/parent/directory")
child.expect("!")
print(child.before)

如果我 运行 来自父目录的脚本,一切都很好。但是,如果我从任何其他目录 运行 它,比如这里的 dir ,我会收到以下错误:

pexpect.ExceptionPexpect: The command was not found or was not executable: ./hw.

我该如何应对?

我已经在 Mac OS 和 Ubuntu 上试过了。 HelloWorld 二进制文件工作正常,它被设置为可执行文件。 Python 2.7.6,预计 3.3

对于 运行 可执行文件 hw,其父目录应位于 PATH 环境变量中,或者您应提供完整路径。如果路径是相对路径(不推荐),则它是相对于当前工作目录的路径,而不考虑 cwd 值。

如果你想从它的目录运行hw:

import os
import pexpect # $ pip install pexpect

hw = '/absolute/path/to/parent/directory/hw'
child = pexpect.spawn(hw, cwd=os.path.dirname(hw))
# ...

回答的很清楚了,还想补充一点,

如果您在目录 /path/to/parent/dir

中有一个可执行脚本 (script.sh)
child = pexpect.spawn("./script.sh", cwd="/path/to/parent/dir")  # wont work

./ 一样,它试图从脚本当前工作目录执行,如果您不知何故需要它工作,那么您可以添加 os.chdir(),因此

os.chdir("/path/to/parent/dir")
child = pexpect.spawn("./script.sh")  # works

如果您不需要将脚本路径全部更改为 运行 子进程,可以生成 pexpect 进程,

child = pexpect.spawn("/path/to/parent/dir/script.sh")  # wont works for my script

如果 script.sh 中提到了相对路径,这将不起作用,因为 cwd(当前工作目录)是 python 脚本的 cwd。在我的例子中 script.sh 需要它存在的目录中的资源,

所以为了执行它,

child = pexpect.spawn("/path/to/parent/dir/script.sh", cwd="/path/to/parent/dir") # works 

如果您没有 script.sh 的硬编码父路径,请使用

中提到的 os.path.dirname("<absolute path to script.sh>")