Python подпроцесс FileNotFoundError - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь следовать этому блогу о том, как выполнить R-скрипт из Python.У меня R-скрипт работает нормально из командной строки с использованием Rscript.

Вот мой код Python:

import subprocess
import os

command = "C:\Program Files\R\R-3.4.4\bin\Rscript"
path2script = os.getcwd() + "\max.R" # gives me the absolute path to the R script
args = ["11", "3", "9", "42"]

cmd = [command, path2script] + args
x = subprocess.check_output(cmd, universal_newlines = True)

, который дает мне эту ошибку:

FileNotFoundError: [WinError 2] Системе не удается найти указанный файл

Я прочитал много SO-сообщений об этой ошибке, и в большинстве случаев возникает проблема с попыткой вызова системные команды вроде dir или передача аргументов check_output в неправильном порядке , но в моем случае я действительно не вижу, что должно идти не так.

После некоторые советы Я попытался построить строку для cmd вместо списка, а затем передать ее check_output, используя аргумент shell = True - когда я это делаю, я получаю CalledProcessError: returned non-zero exit status 1.

Я предполагаю, что этот код, который в точности соответствует тому, как он появился в блоге, кроме добавления абсолютного пути к файлу, сейчас не работает, поскольку поведение check_output изменилось с 2015 года ...

Может кто-нибудь помочь?

Вот трассировка стека:

Traceback (most recent call last):

  File "<ipython-input-2-3a0151808726>", line 1, in <module>
    runfile('C:/Users/TomWagstaff/Documents/Raising IT/Projects/15 AdWords/Python_R_test/run_max.py', wdir='C:/Users/TomWagstaff/Documents/Raising IT/Projects/15 AdWords/Python_R_test')

  File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/TomWagstaff/Documents/Raising IT/Projects/15 AdWords/Python_R_test/run_max.py", line 31, in <module>
    x = subprocess.check_output(cmd, universal_newlines = True)

  File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\subprocess.py", line 336, in check_output
    **kwargs).stdout

  File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\subprocess.py", line 403, in run
    with Popen(*popenargs, **kwargs) as process:

  File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\site-packages\spyder\utils\site\sitecustomize.py", line 210, in __init__
    super(SubprocessPopen, self).__init__(*args, **kwargs)

  File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\subprocess.py", line 709, in __init__
    restore_signals, start_new_session)

  File "C:\Users\TomWagstaff\Anaconda3\envs\adwords\lib\subprocess.py", line 997, in _execute_child
    startupinfo)

FileNotFoundError: [WinError 2] The system cannot find the file specified

1 Ответ

0 голосов
/ 05 декабря 2018

проверьте, что у вас есть правильный путь для команды и сценария

print(os.path.exists(command))
print(os.path.exists(path2script))

обратите внимание, что путь записи с обратными слешами может быть опасным, так как вы можете создать escape-последовательность таким способом, который будет интерпретироваться по-разному.Вы можете написать пути к Windows с косой чертой и затем вызвать os.path.normpath для них, превратив их в безопасную форму (также в команде вы можете использовать только прямую косую черту, интерпретировать Python на самом деле все равно.было бы, вероятно, проблема, хотя)

...