3

我使用os.walk()and搜索了一些子文件夹中的 python 脚本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 文件,如果我直接转到该文件夹​​并执行该文件,我不会得到它。另一个测试是 using subprocess,我得到了一个权限错误:

OSError: [Errno 13] 权限被拒绝

我怀疑这可能是因为 .py 文件没有可执行权限。但是,使每个文件成为可执行文件是另一个问题。

在列表中执行 python 文件的正确方法是什么?

编辑:更具体

当转到我的 jupyter notebook 上的特定目录并将文件执行为

!python file1.py

它工作正常,但使用列表时我得到

for fname in pylist:    
    !python fname

python:无法打开文件'fname':[Errno 2]没有这样的文件或目录

所以看起来python没有读取列表中的元素,而是试图执行fname。我检查os.path.abspath(fname)了路径是否正确。

4

1 回答 1

1

您的循环存在一些问题。无需获取len,然后查找索引。for...in...循环将获取实际的文件字符串。您可以使用该subprocess模块拨打电话。

import subprocess

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

for fname in files:

    subprocess.call([fname])


print("done")

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

#!/usr/bin/env python

# py1.py
print("test 1")

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

>>>import py1
test 1
于 2018-02-16T21:13:08.457 回答