Как запустить файл .plt во всех подкаталогах с помощью gnuplot с использованием python?

#python #subprocess #gnuplot

Вопрос:

Моя структура каталогов выглядит следующим образом, с другим файлом .plt в конце каждого подкаталога.

Я хочу запустить эти файлы с помощью gnuplot. Это то, что у меня есть:

 directory = "./"
for root, subdirectories, files in os.walk(directory):
    for file in files:
        if file.endswith('.plt'):
            plot = subprocess.POpen(['gnuplot', '-p'], shell = True, stdin=subprocess.PIPE)
            plot.communicate("load '%s'" % (file))
            plot.wait()
            print(plot.returncode)
 

Но это возвращается:

 $ python3 messiah.py
Traceback (most recent call last):
  File "messiah.py", line 115, in <module>
    plot.communicate("load '%s'" % (file))
  File "/usr/lib/python3.8/subprocess.py", line 1009, in communicate
    self._stdin_write(input)
  File "/usr/lib/python3.8/subprocess.py", line 958, in _stdin_write
    self.stdin.write(input)
TypeError: a bytes-like object is required, not 'str'
-p: 1: gnuplot: not found
 

Редактировать: В конце каждого каталога также есть файл .dat, который файл .plt использует для формирования графика. Вот почему я должен перейти в каталог, в котором находятся оба файла, а затем запустить gnuplot в cmd. Если я попытаюсь загрузить файл .plt извне, он выдаст сообщение об ошибке, в котором говорится, что соответствующий файл .dat не найден.

Я попробовал это:

     source = "/mnt/d/Darshana_Project/Data"
    for root, subdir, files in os.walk(source):
        if not subdir:
            file = [fi for fi in files if fi.endswith('.plt')]
            cmd1 = "cd "%s"" % (root)
            cmd2 = "gnuplot -p '%s'" % (file[0])
            command = cmd1 ';' cmd2
            plot = subprocess.Popen(command, shell=True, encoding='utf8')
            plot.wait()
 

Но это просто дает мне: The system cannot find the path specified рекурсивно по всем подкаталогам.

Комментарии:

1. Вероятно, не стоит менять каталог в gnuplot. Тогда вы получаете путаницу, которую вы получаете. Просто укажите gnuplot абсолютный путь к файлу, как я сделал в своем ответе, что-то вроде ffname = os.path.join(root,file)

Ответ №1:

Следующее работает для меня при использовании Python 3.6.3 в Win10. Я надеюсь, что вы сможете адаптировать его к своей операционной системе.

 ### start all gnuplot files in tree
import os, subprocess

directory = r'C:UsersTest'
gnuplotpath = r'C:UsersProgramsgnuplotbingnuplot'

for root, subdirectories, files in os.walk(directory):
    for file in files:
        if file.endswith('.plt'):
            ffname = os.path.join(root,file)
            cmd = '{} -p "{}"'.format(gnuplotpath,ffname)
            plot = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE)
            plot.communicate()
            plot.wait()
            print(plot.returncode)
### end of code
 

Комментарии:

1. На моем пути к gnuplot есть пробел. cmd выдает мне сообщение «… не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл». ошибка. Есть ли способ обойти это, кроме переустановки gnuplot в другом месте без пробелов?

2. @PrajjwalDas Я бы попытался дополнительно поместить его в одинарные кавычки gnuplotpath = r"'C:UsersProgramsgnuplotbingnuplot'" (а не в двойные, как я говорил ранее).