Выполнить файлы Python из списка

Я выполнил поиск сценариев Python в некоторых подпапках, используя os.walk() и endswith(file.py), и поместил их в список. Сейчас пытаюсь их выполнить. Итак, у меня есть список типа:

pylist = ['./1/file1.py', './2/file2.py', ...]

и я попытался выполнить их с помощью цикла for:

for i in range(len(pylist)):
    %run pylist[i]

а также (я использую блокнот jupyter)

for i in range(len(pylist)):
    !python pylist[i]

но в обоих случаях он не находит файл pylist[i].py, поэтому не берет содержимое списка. я тоже пробовал

for i in range(len(pylist)):
    execfile(pylist[i])

но это дает мне

indexError: индекс списка вне допустимого диапазона

с одним из файлов python, который я не получу, если перейду прямо в папку и выполню файл. Еще один тест использовал subprocess, для которого я получил ошибку разрешения:

OSError: [Errno 13] Отказано в доступе

я подозреваю, что это может быть связано с тем, что файлы .py не имеют прав на выполнение. Но тогда сделать каждый файл исполняемым — это еще одна проблема.

Каков правильный способ выполнения файлов Python в списке?

Изменить: более конкретно

При переходе в определенный каталог на моем ноутбуке Jupyter и выполнении файла как

!python file1.py

он отлично работает, но при использовании списка я получаю

for fname in pylist:    
    !python fname

python: не удается открыть файл «fname»: [Errno 2] Нет такого файла или каталога

поэтому кажется, что python не читает элементы в списке, а пытается выполнить fname. Я проверил с помощью os.path.abspath(fname) правильность путей.


person EternalGenin    schedule 16.02.2018    source источник


Ответы (1)


У вас есть несколько проблем с циклом. Нет необходимости получать len, а затем искать индекс. Цикл for...in... получит фактическую строку файла. Вы можете использовать модуль subprocess для совершения звонка.

import subprocess

files = ['./py1.py', './py2.py']

for fname in files:

    subprocess.call([fname])


print("done")

содержимое py1 и py2, которые у меня были хеш-банг и печать:

#!/usr/bin/env python

# py1.py
print("test 1")

Наконец, вы всегда можете импортировать файлы, но сделать это со списком может быть сложно.

>>>import py1
test 1
person ryati    schedule 16.02.2018
comment
Вы давали разрешения своим py1 и py2? например chmod +x py1.py? Поскольку это не работает для меня, я получаю сообщение об отказе в разрешении. - person EternalGenin; 20.02.2018
comment
Я явно не давал права доступа к файлам, однако при проверке оказалось, что все они имеют разрешение exe. Он, должно быть, унаследовал это. - person ryati; 20.02.2018
comment
возможно, нубский вопрос, но когда я запускаю subprocess.call("test.py") из скрипта в той же директории, что и test.py, выдает ошибку о том, что файл не найден. Чтобы быть более явным, у меня есть caller.py и test.py в одном каталоге, вызывающий абонент запускает приведенный выше код. Любая идея, что я делаю неправильно? - person Adam B; 22.02.2020
comment
ОМГ, я действительно нуб. Для будущих читателей: subprocess.call(['python', 'test.py']). Нужно вызвать python для его запуска, так как его нет в пути. - person Adam B; 22.02.2020