无法通过 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>")
我无法通过 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>")