#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'"
(а не в двойные, как я говорил ранее).