Can*_*ice 3 curl r libcurl rcurl
首先 - 我知道这不是一个特定的代码问题,所以可以随意投票结束这个问题,但我今天花了大半天的时间来解决这个问题,可以使用一些帮助。我也认为这个线程可以帮助任何试图让 sftp 协议在 R 中工作的人,因为我将分享我今天所做的事情。
我一直在尝试更新 RCurl,使其支持 sftp 协议。在 R 中,我的协议看起来是这样(还有版本和主机):
> library(RCurl)
> curlVersion()$protocols
[1] "dict" "file" "ftp" "ftps" "gopher" "http" "https" "imap" "imaps" "ldap" "ldaps" "pop3" "pop3s" "rtsp" "smb" "smbs"
[17] "smtp" "smtps" "telnet" "tftp"
> curlVersion()$version
[1] "7.43.0"
> curlVersion()$host
[1] "x86_64-apple-darwin15.0"
Run Code Online (Sandbox Code Playgroud)
不是很好 - 没有 sftp 选项...
我按照这个线程 - http://andrewberls.com/blog/post/adding-sftp-support-to-curl - 在我的机器上更新 curl,并且部分成功。成功部分反映在我在命令行中运行以下内容时:
curl -V
curl 7.55.1 (x86_64-apple-darwin15.6.0) libcurl/7.55.1 zlib/1.2.5
libssh2/1.8.0
Release-Date: 2017-08-14
Protocols: dict file ftp gopher http imap ldap ldaps pop3 rtsp scp sftp smtp telnet tftp
Features: AsynchDNS IPv6 Largefile libz UnixSockets
Run Code Online (Sandbox Code Playgroud)
这很棒,因为我已经更新了 curl。但是,当我加载 RCurl 并在 R 中运行 curlVersion() 时,它没有更新。我检查了我的 /usr/ 目录的 lib 文件夹并遇到以下问题。在我的 /usr/lib 和 /usr/local/lib 中,都存在 libcurl 文件。具体来说:
我的 /usr/local/lib 目录中的文件是我想要使用的新文件,但是这里是我最头疼的地方。我将这四个文件从 /usr/local/lib 复制到 /usr/lib 并损坏了我的计算机。我的许多应用程序停止加载,我不得不重新安装我的 OS X,因为我害怕弄乱其他任何东西。当我重新安装 OS X 时,它会将我的文件放回各自的文件夹中(它们在上面的项目符号中的外观)。
如果我不得不猜测,我可能不应该移动 .a 或 .la 文件......我不确定。
最后一件事 - 当我在控制台中运行 $ $PATH 时,我得到:
$PATH
-bash: /Users/Home/.rvm/gems/ruby-2.3.3/bin:/Users/Home/.rvm/gems/ruby-2.3.3@global/bin:/Users/Home/.rvm/rubies/ruby-2.3.3/bin:/Users/Home/anaconda2/bin:/usr/local/git/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/TeX/texbin:/Users/Home/.rvm/bin: No such file or directory
Run Code Online (Sandbox Code Playgroud)
/usr/local/bin 在 /usr/bin 之前。但我没有看到 /usr/local/lib 或 /usr/lib 的任何内容 - 我可以将这些 (/usr/local/lib) 添加到我的路径中来解决这个问题吗?R 中的 .libPaths() 给了我这个:
.libPaths()
"/Library/Frameworks/R.framework/Versions/3.4/Resources/library"
Run Code Online (Sandbox Code Playgroud)
...如果它有帮助的话
编辑 - 我应该注意到所有问题的根源,当然,是因为 'sftp' 没有在 R 中的 curlVersion()$protocols 中列出,当我运行 RCurl::getURL() 或 RCurl::ftpUpload() (我希望使用 ftpUpload),对于我收到的错误:
> RCurl::ftpUpload(what = 'myfile.txt', to = 'sftp://userid:userpw@ip/'myfile.txt')
Error in function (type, msg, asError = TRUE) :
Protocol "sftp" not supported or disabled in libcurl
Run Code Online (Sandbox Code Playgroud)
谢谢!
小智 5
呼!最终在带有 rstudio-server 的 Ubuntu 14.04 docker 容器中实现了这个功能。我击中了每一个问题!但是我不得不花费更多的时间来计算找到所有这些东西,所以我试图将所有这些都放在一个地方,让其他有这个问题的人可以使用这就是我所做的......
在 Linux 终端中:
apt-get install libcurl4-openssl-dev
wget libssh2 and then compile with ordinary
./configure
make
make install
wget curl and then compile
./configure --with-sshlib2=/usr/local
make
make install
如果您需要 curl 在带有 sftp 的终端中工作,此时可能仍然无法使用。使用您刚刚安装的新 libcurl.so.4 验证它。您刚刚安装的 curl 将安装到 /usr/local/bin 中,因此请使用 ldd 来验证它没有使用旧库。我使用的是旧的 libcurl,所以我将旧的 libcurl 链接到 /usr/local/lib 中的新 libcurl,然后重新编译 curl。
如果您希望 RCurl 工作,请将所有新库从 /usr/local/lib(libcurl 和 libssh2)复制到 /lib,然后移至 R 控制台。
在 Rconsole 中:
install.packages("RCurl", type = "source")
验证 sftp 协议已启用
libcurlVersion()
RCurl::curlVersion()
这些应该分别显示为 libcurl 和 RCurl 启用的协议。为 sftp 交叉你的手指!
以防万一,我也做了这些可能没有太大作用的事情,但我在撞墙时做了,只是保持原地不动。
升级的 R 和 R 工作室服务器
在重新安装 RCurl 之前删除了 curl 和 RCurl 的 R 版本。同样在较新的 rstudio 中,我不确定是否需要 type="source"。
同样正如 Canovice 所指出的,在 libcurl 和 libssh 库之间移动时要小心。我中断了几次网络,幸运的是因为它是我刚刚重新启动的 docker 容器。我发现一次移动所有东西效果最好,
cp /usr/local/lib/libssh* /lib && cp /usr/local/lib/libcurl* /lib
还应该注意我是一个完全的 R 新手,所以可能有比在整个地方移动库更干净的方法来做到这一点。我尝试.libaths(在 rstudio 中使用),但最终放弃了。
| 归档时间: |
|
| 查看次数: |
2484 次 |
| 最近记录: |