背景,我正在尝试使用一个Python库,该库使用arguments生成一个子进程["bash", "-c", "python someScript.py"]
。发生的情况是执行了 Python 2.6,但我想要 python2.7。 Python 2.6 已上线/usr/bin/
,Python 2.7 已上线/usr/local/bin
如果我说python -V
并且type python
我得到:
Python 2.7.10
和python is aliased to /usr/local/bin/python2.7
.bashrc
(注意,我已经在我的文件中设置了这个别名alias python=/usr/local/bin/python2.7
:)
但是,如果我调用bash -c "type python"
我会得到:
python is /usr/bin/python
echo $PATH
和都bash -c "echo $PATH"
输出相同的路径:
/usr/local/bin:/usr/local/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/lib:/usr/local/lib
/usr/local/bin
请注意,当我在 .bashrc 中导出 PATH 时,我尝试将其放在第一位。
所以我的问题是,当我使用 执行字符串命令时,什么控制路径(在本例中为 Python)bash -c
?具体来说,如何bash -c "python"
使用 Python 2.7?编辑:参数["bash", "-c", "python someScript.py"]
是硬编码在库中的,我不想修改库源。
答案1
问题是,在执行 时bash -c '....'
,您正在生成 的非交互式(且非登录)会话bash
,这不会有source
任何运行时配置文件,例如~/.bashrc
。
当您定义了alias
in 时~/.bashrc
,您可以使用该-i
选项来bash
模拟交互式环境以及source
文件~/.bashrc
:
bash -ic '....'
现在alias
应该可用了。
例子:
$ alias l
alias l='ls'
$ bash -c 'l'
bash: l: command not found
$ bash -ic 'l'
bar foo
答案2
使用命令的完整路径。bash -c /usr/local/bin/python
答案3
我认为您的 .bashrc 不是源自非交互式 shell,例如这样 - 尝试将 PATH 设置放入您的 .profile 文件中,这也适用于其他一些 shell(或 .bash_profile 如果您只想将其设置为 bash )。