Как правильно использовать stdin, stdout и stderr в Python 2.7? - PullRequest
0 голосов
/ 19 марта 2020

У кого-нибудь есть опыт использования команды subprocess.call в Python? Я продолжаю получать ошибки всякий раз, когда в моем коде есть строка, подобная этой:

INFILE1 = open(script_dir+"/Scripts/plot_TSS_profile.R","r")
  subprocess.call("Rscript","--slave","--args",filenames["housekeeping_profile"]+" "+filenames["unexpressed_profile"]+" "+filenames["profile_plot"],stdin=INFILE1,  stderr=ERR_LOG,stdout=OUT_LOG,shell=True)
   INFILE1.close(). 

Если я оставляю код как есть, я получаю ошибку, что программа находит несколько значений для каждого stdin, stderr и stdout по какой-то причине, хотя они являются единственными в коде. Если я вычеркну эти параметры и просто поставлю инфиль в начале скобок после «--args», он, похоже, не прочитает файл, так как говорит, что «буфер должен быть целым числом».

Для Например, этот способ выдает ошибку буфера:

INFILE1 = script_dir+"/Scripts/plot_TSS_profile.R"
    subprocess.call("Rscript",INFILE1,"--slave","--args",filenames["housekeeping_profile"]+" "+filenames["unexpressed_profile"]+" "+filenames["profile_plot"],stderr=ERR_LOG,shell=True)
    INFILE1.close()

Вот мои выходные данные об ошибках для получения более подробной информации c:

Значение буфера:

Traceback ( последний вызов последним): файл "/mnt/work1/users/pughlab/projects/IEG_MiSEQ/Inferring_DNA_Expression/ExpressionPrediction-master/expression_prediction.py", строка 277, в

    step5(ERR_LOG,OUT_LOG,args,proj_dir,script_dir,filenames)
  File "/mnt/work1/users/pughlab/projects/IEG_MiSEQ/Inferring_DNA_Expression/ExpressionPrediction-master/expression_prediction.py", line 165, in step5
    subprocess.call("Rscript",INFILE1,"--slave","--args",filenames["housekeeping_profile"]+" "+filenames["unexpressed_profile"]+" "+filenames["profile_plot"],stderr=ERR_LOG,shell=True)
  File "/mnt/work1/software/centos7/python/2.7.15/lib/python2.7/subprocess.py", line 172, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/mnt/work1/software/centos7/python/2.7.15/lib/python2.7/subprocess.py", line 343, in __init__
    raise TypeError("bufsize must be an integer")
TypeError: bufsize must be an integer

и другая ошибка при существует несколько значений:

 Traceback (most recent call last):
  File "/mnt/work1/users/pughlab/projects/IEG_MiSEQ/Inferring_DNA_Expression/ExpressionPrediction-master/expression_prediction.py", line 272, in <module>
    step5(ERR_LOG,OUT_LOG,args,proj_dir,script_dir,filenames)
  File "/mnt/work1/users/pughlab/projects/IEG_MiSEQ/Inferring_DNA_Expression/ExpressionPrediction-master/expression_prediction.py", line 165, in step5
    subprocess.call("Rscript","--slave","--args",filenames["housekeeping_profile"]+" "+filenames["unexpressed_profile"]+" "+filenames["profile_plot"],stdin=INFILE1,stderr=ERR_LOG,stdout=OUT_LOG,shell=True)
  File "/mnt/work1/software/centos7/python/2.7.15/lib/python2.7/subprocess.py", line 172, in call
    return Popen(*popenargs, **kwargs).wait()
TypeError: __init__() got multiple values for keyword argument 'stdin'

Спасибо

1 Ответ

0 голосов
/ 19 марта 2020

Основная проблема заключается в том, что call принимает список аргументов или одну строку для анализа оболочкой. Вам, кажется, не нужно shell=True здесь; просто создайте единый список всех позиционных аргументов, которые вы пытаетесь передать.

with open(script_dir+"/Scripts/plot_TSS_profile.R","r") as INFILE1:
    cmd = [
        "Rscript",
        "--slave",
        "--args",
        filenames["housekeeping_profile"], 
        filenames["unexpressed_profile"],
        filenames["profile_plot"]
    ]
    subprocess.call(cmd, stdin=INFILE1, stderr=ERR_LOG, stdout=OUT_LOG)

Передача нескольких позиционных аргументов означает, что параметры, которые должны были быть установлены с помощью аргументов ключевых слов (например, stdin, et c ) присваиваются значения, которые должны были быть частью команды для выполнения.

...