[R] Error when calling (R 4.0.x on Windows) from Python
Marcel Baumgartner
m@rce| @end|ng |rom coeurd@rt|ch@ut@ch
Fri Jan 29 09:57:07 CET 2021
Dear Bill, Duncan and Martin,
thanks for your investigation. Can you clarify on next steps? Is this
now an official bug, or have you found a workaround? For your
information: the issue showed up the first time when I called R 4.0.2
from within a software called "IDEA" (from Caseware Analytics), using
their scripting language (similar to Visual Basic). With my colleague
we then simply reproduce the error calling R from Python, so that we
could share it more easily. When we run this command directly on the
CMD in Windows, all works fine. The issue only happens when R is
called within another software.
Best regards
Marcel
Le 2021-01-27T23:14:36.000+01:00, Bill Dunlap
<williamwdunlap using gmail.com> a écrit :
> I tried the following change, that adds quotes if the argument does
>
> not include ">".
>
> Index: front-ends/rcmdfn.c
>
> ===================================================================
>
> --- front-ends/rcmdfn.c (revision 79883)
>
> +++ front-ends/rcmdfn.c (working copy)
>
> @@ -173,9 +173,13 @@
>
> fprintf(stderr, "command line too long\n");
>
> return(27);
>
> }
>
> - strcat(cmd, "\"");
>
> + if (!strchr(argv[i], '>')) {
>
> + strcat(cmd, "\"");
>
> + }
>
> strcat(cmd, argv[i]);
>
> - strcat(cmd, "\"");
>
> + if (!strchr(argv[i], '>')) {
>
> + strcat(cmd, "\"");
>
> + }
>
> }
>
> /* the outermost double quotes are needed for cmd.exe */
>
> strcat(cmd, "\"");
>
> It lets the python example work. I am not sure that quoting all the
>
> arguments buys you much, as shQuote() is still needed for arguments
>
> that include spaces. E.g., with 3.6.3, 4.0.3, and my development
>
> build with the above patch we get
>
>> stopifnot(dir.create(dirname <- file.path(tempfile(), "A SPACE"),
>> recursive=TRUE))
>>
>> logname <- file.path(dirname, "log.txt")
>>
>> unlink(logname)
>>
>> system(paste( "C:\\R\\R-3.6.3\\bin\\R.exe --quiet --vanilla -e
>> \"commandArgs()\" 1>", logname))
>
> ARGUMENT 'SPACE/log.txt' __ignored__
>
> [1] 0
>
>> tryCatch(readLines(logname), error=function(e)conditionMessage(e))
>
> [1] "cannot open the connection"
>
> Warning message:
>
> In file(con, "r") :
>
> cannot open file
>
> 'C:\Users\willi\AppData\Local\Temp\RtmpM5tsC7\file1a1068734a49/A
>
> SPACE/log.txt': No such file or directory
>
>> system(paste( "C:\\R\\R-4.0.3\\bin\\R.exe --quiet --vanilla -e
>> \"commandArgs()\" 1>", logname))
>>
>> commandArgs()
>
> [1] "C:\\R\\R-40~1.3/bin/x64/Rterm.exe"
>
> [2] "--quiet"
>
> [3] "--vanilla"
>
> [4] "-e"
>
> [5] "commandArgs()"
>
> [6] "1>"
>
> [7]
> "C:\\Users\\willi\\AppData\\Local\\Temp\\RtmpM5tsC7\\file1a1068734a49/A"
>
> [8] "SPACE/log.txt"
>
>>
>
> [1] 0
>
>> tryCatch(readLines(logname), error=function(e)conditionMessage(e))
>
> [1] "cannot open the connection"
>
> Warning message:
>
> In file(con, "r") :
>
> cannot open file
>
> 'C:\Users\willi\AppData\Local\Temp\RtmpM5tsC7\file1a1068734a49/A
>
> SPACE/log.txt': No such file or directory
>
>> unlink(logname)
>>
>> system(paste(
>> "C:\\msys64\\home\\willi\\ucrt3\\r\\trunk\\bin\\R.exe --quiet
>> --vanilla -e \"commandArgs()\" 1>", logname))
>
> [1] 0
>
>> tryCatch(readLines(logname), error=function(e)conditionMessage(e))
>
> [1] "cannot open the connection"
>
> Warning message:
>
> In file(con, "r") :
>
> cannot open file
>
> 'C:\Users\willi\AppData\Local\Temp\RtmpM5tsC7\file1a1068734a49/A
>
> SPACE/log.txt': No such file or directory
>
>> tryCatch(readLines(sub(" .*$", "", logname)),
>> error=function(e)conditionMessage(e))
>
> [1] "> commandArgs()"
>
> "[1]
>
> \"C:\\\\msys64\\\\home\\\\willi\\\\ucrt3\\\\r\\\\trunk/bin/x64/Rterm.exe\""
>
> [3] "[2] \"--quiet\"
>
> " "[3] \"--vanilla\"
>
> "
>
> [5] "[4] \"-e\"
>
> " "[5] \"commandArgs()\"
>
> "
>
> [7] "[6] \"SPACE/log.txt\"
>
> " "> "
>
> [9] "> "
>
>> unlink(logname)
>>
>> system(paste(
>> "C:\\msys64\\home\\willi\\ucrt3\\r\\trunk\\bin\\R.exe --quiet
>> --vanilla -e \"commandArgs()\" 1>", shQuote(logname)))
>
> [1] 0
>
>> tryCatch(readLines(logname), error=function(e)conditionMessage(e))
>
> [1] "> commandArgs()"
>
> "[1]
>
> \"C:\\\\msys64\\\\home\\\\willi\\\\ucrt3\\\\r\\\\trunk/bin/x64/Rterm.exe\""
>
> [3] "[2] \"--quiet\"
>
> " "[3] \"--vanilla\"
>
> "
>
> [5] "[4] \"-e\"
>
> " "[5] \"commandArgs()\"
>
> "
>
> [7] "> "
>
> "> "
>
> -Bill
>
> On Wed, Jan 27, 2021 at 1:25 PM Duncan Murdoch
> <murdoch.duncan using gmail.com> wrote:
>
>> On 27/01/2021 3:40 p.m., Bill Dunlap wrote:
>>
>>> I believe the problem is from svn 77925 in
>>> gnuwin/front-ends/rcmdfn.c,
>>>
>>> which was committed a few days after 3.6.3 was released. Rterm
>>> used
>>>
>>> to put double quotes around a command line argument only if it
>>>
>>> contained a space, now it double quotes all arguments. It sees
>>> shell
>>>
>>> constructs like "1>" and the following file name as arguments
>>> and
>>>
>>> double quoting them hides them from the shell, leading to this
>>>
>>> problem. I think we may have to rely on the user supplying
>>> quotes as
>>>
>>> needed instead of blindly adding them.
>>
>> Okay, now I see what you mean.
>>
>> If you invoke R using R.exe, it asks cmd.exe to run Rterm.exe, so
>> it is
>>
>> possible that redirection would be handled.
>>
>> If you invoke R directly using Rterm.exe, then my description
>> down below
>>
>> would be correct.
>>
>> Duncan Murdoch
>>
>>> -Bill
>>>
>>> On Wed, Jan 27, 2021 at 12:28 PM Duncan Murdoch
>>>
>>> <murdoch.duncan using gmail.com> wrote:
>>>
>>>> On 27/01/2021 3:17 p.m., Duncan Murdoch wrote:
>>>>
>>>>> On 27/01/2021 3:38 a.m., Martin Maechler wrote:
>>>>>
>>>>>>>>>>> Martin Maechler
>>>>>>>>>>>
>>>>>>>>>>> on Tue, 26 Jan 2021 12:37:58 +0100 writes:
>>>>>>
>>>>>>>>>>> Marcel Baumgartner
>>>>>>>>>>>
>>>>>>>>>>> on Tue, 26 Jan 2021 08:55:48 +0100 writes:
>>>>>>
>>>>>> Dear all, my colleague posted our issue on stackoverflow:
>>>>>>
>>>>>> Calling R script from Python does not save log file in
>>>>>>
>>>>>> version 4 - Stack Overflow
>>>>>>
>>>>>> [stackoverflow.com/questions...
>>>>>> [https://stackoverflow.com/questions/65887485/calling-r-script-from-python-does-not-save-log-file-in-version-4]]
>>>>>>
>>>>>> It is about this kind of call to R:
>>>>>>
>>>>>> R.exe -f code.R --args "~/file.txt" 1> "~/log.txt" 2>&1".
>>>>>>
>>>>>> The issue is that the log.txt file is not created when
>>>>>>
>>>>>> running R 4.x.x. The same code works perfectly fine with
>>>>>>
>>>>>> R 3.6.x.
>>>>>>
>>>>>> Any idea what's going wrong as of version 4? Regards
>>>>>>
>>>>>> Marcel
>>>>>>
>>>>>> Dear Marcel, I think the solution is embarrassingly
>>>>>>
>>>>>> simple:
>>>>>>
>>>>>> From the SO post, where she showed a bit more detail than
>>>>>> you
>>>>>>
>>>>>> show here, it's clear you have confused 'R.exe' and
>>>>>>
>>>>>> 'Rscript.exe' and what you say above is not true:
>>>>>>
>>>>>> 'R.exe' was used for R 3.6.0 but for R 4.0.3, you/she
>>>>>> used
>>>>>>
>>>>>> 'Rscript.exe' instead.
>>>>>>
>>>>>> ... as you've noticed now, they do behave differently,
>>>>>>
>>>>>> indeed!
>>>>>>
>>>>>> Well, this was not the solution to their -- Windows-only
>>>>>> -- problem.
>>>>>>
>>>>>> The problem *is* indeed visible if they only use R.exe
>>>>>> (also
>>>>>>
>>>>>> for R 4.0.3).
>>>>>>
>>>>>> I've commented more on the SO issue (see above),
>>>>>>
>>>>>> notably asking for a *minimal* repr.ex. (reproducible
>>>>>> example),
>>>>>>
>>>>>> and one *not* using "<YOUR PATH>" and setwd() ..
>>>>>
>>>>> Isn't this purely a Python or user problem? R shouldn't
>>>>> process
>>>>>
>>>>> redirection directives like
>>>>>
>>>>> 1> "~/log.txt" 2>&1
>>>>>
>>>>> because it's the shell's job to process those. If Python is
>>>>> acting as
>>>>>
>>>>> the shell, it needs to handle those things. If R was
>>>>> handling the
>>>>>
>>>>> command via
>>>>
>>>> Oops, sent before finishing:
>>>>
>>>> If R was handling the command via system() or system2(), it
>>>> would handle
>>>>
>>>> redirection itself. If it was using the Windows-only shell(),
>>>> it would
>>>>
>>>> call cmd.exe (by default) to handle redirection. (This is a
>>>> difference
>>>>
>>>> between R on Windows and R in Unix: in Unix a shell is always
>>>> used.)
>>>>
>>>> Duncan Murdoch
>>>>
>>>> ______________________________________________
>>>>
>>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more,
>>>> see
>>>>
>>>> stat.ethz.ch/mailman/listin...
>>>> [https://stat.ethz.ch/mailman/listinfo/r-help]
>>>>
>>>> PLEASE do read the posting guide
>>>> www.R-project.org/posting-g...
>>>> [http://www.R-project.org/posting-guide.html]
>>>>
>>>> and provide commented, minimal, self-contained, reproducible
>>>> code.
[[alternative HTML version deleted]]
More information about the R-help
mailing list