Выполнить файлы 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) что пути правильные.

1 ответ

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

import subprocess

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

for fname in files:

    subprocess.call([fname])


print("done")

содержимое py1 и py2, что у меня есть hashbang и печать:

#!/usr/bin/env python

# py1.py
print("test 1")

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

>>>import py1
test 1
Другие вопросы по тегам