【问题标题】:Why do which and Sys.which return different paths?为什么 which 和 Sys.which 返回不同的路径?
【发布时间】:2018-06-13 13:24:31
【问题描述】:

我尝试从 R 运行 Python 脚本:

system('python script.py arg1 arg2')

得到一个错误:

ImportError: 没有名为 pandas 的模块

这有点令人惊讶,因为脚本按预期从终端运行。之前遇到过此类问题(使用knitr,因此engine.path 块选项),我知道要检查:

Sys.which('python')
#            python 
# "/usr/bin/python"

并将其与命令行进行比较:

$ which python
# /Users/michael.chirico/anaconda2/bin/python

(即,出现错误是因为我为 anaconda 发行版安装了 pandas,虽然 TBH 我不知道为什么我有不同的发行版)

因此我可以通过运行来解决我的问题:

system('/Users/michael.chirico/anaconda2/bin/python script.py arg1 arg2')

我的问题有两个:

  • R 的system/Sys.which 如何找到与我的终端不同的python
  • 除了每次都写出完整的二进制路径外,我还能如何解决这个问题?

我阅读了?Sys.which 的一些提示,但无济于事。特别是,?Sys.which 建议 Sys.which 正在使用 which

这是系统命令which的接口

这显然 (?) 不真实;可以肯定的是,我检查了Sys.which('which')which which 以确认两者都指向/usr/bin/which(被这个花絮刺激):

在类 Unix 上,安装 R 时找到的完整路径(通常为 /usr/bin/which)。

对于后者,我一时兴起尝试了Sys.setenv(python = '/Users/michael.chirico/anaconda2/bin/python'),但无济于事。

【问题讨论】:

  • 期待答案,上周我有一个 bash 脚本,它可以从终端运行,但不能从 R 中的系统命令运行,但没有花时间调试或将其写成问题. (这是一次性的,所以我懒洋洋地从终端运行它。)
  • 假设所有这些都服从$PATH$PATH 必须不同 - R 中的 system("echo $PATH") 和 shell 中的 echo $PATH 是什么?这与python which 的发现一致吗? system("which python") 是否与Sys.which("python") 相同?
  • @Spacedman 很好的建议,而且你正在做一些事情,事实上我的 anaconda2/bin 目录在我的 终端 $PATH 上,但不在已知的路径上R 中的system。鉴于此,我想system('which python')Sys.which('python') 相同也就不足为奇了(从system 找到的python 没有pandas 的事实中基本上可以清楚地看出这一点。附)
  • 所以问题是:有没有一种非黑客的方式来设置PATH 同步?我显然可以将我在终端中找到的内容复制粘贴到Sys.setenv(PATH=...)
  • 那么如何启动 RStudio?从菜单?在这种情况下,它会从启动桌面的进程中获取 PATH。从终端命令行启动 RStudio?那应该得到终端的PATH....

标签: r macos rstudio


【解决方案1】:

正如一些 cmets 所暗示的,这是一个问题,因为 Finder(或 Dock)启动的程序与终端中的程序不同,PATH 环境变量不同。有一些方法可以为 Dock 启动的应用程序设置 PATH,但它们并不漂亮。如果您想走这条路,可以从这里开始寻找:

https://apple.stackexchange.com/questions/51677/how-to-set-path-for-finder-launched-applications

您可以做的另一件事可能更简单,就是告诉 R 在启动时设置 PATH 变量,使用 Sys.setenv 将路径添加到所需的 Python 实例。通过将命令放在相应位置的.Rprofile 文件中,您可以只为一个项目、整个用户帐户或整个系统执行此操作。有关如何在此处执行此操作的更多信息:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/Startup.html

【讨论】:

  • 我希望有一种方法可以从 finder 启动的 R 实例中启动标准终端。如果有一种简单的设计方式说foo,我很乐意添加Sys.setenv(PATH = foo())
  • 链接问题中的主要答案对我不起作用,但这个对我有用:apple.stackexchange.com/a/198282/257940
猜你喜欢
  • 2020-08-24
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多