从列表中执行python文件

时间:2018-02-16 20:48:04

标签: python-2.7 subprocess execfile

我使用os.walk()endswith(file.py)在一些子文件夹中搜索了python脚本,并将它们放在一个列表中。现在我试图执行它们。所以我有一个类型列表:

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 个答案:

答案 0 :(得分:0)

循环中有一些问题。没有必要得到len,然后查找索引。 for...in...循环将获得实际的文件字符串。您可以使用subprocess模块拨打电话。

import subprocess

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

for fname in files:

    subprocess.call([fname])


print("done")

我有一个hashbang和print的py1和py2的内容:

#!/usr/bin/env python

# py1.py
print("test 1")

最后,您始终可以导入文件,但使用列表执行此操作可能具有挑战性。

>>>import py1
test 1