我使用 os.walk()
和 endswith(file.py)
在一些子文件夹中搜索了 python 脚本,并将它们放入列表中。现在我正在尝试执行它们。所以我有一个类型的列表:
pylist = ['./1/file1.py', './2/file2.py', ...]
我尝试使用 for 循环执行它们:
for i in range(len(pylist)):
%run pylist[i]
还有(我使用的是 jupyter notebook)
for i in range(len(pylist)):
!python pylist[i]
但是在这两种情况下它都没有找到文件 pylist[i].py
,所以它没有获取列表的内容。我也试过了
for i in range(len(pylist)):
execfile(pylist[i])
但这给了我一个
indexError: list index out of range
使用其中一个 python 文件,如果我直接转到该文件夹并执行该文件,我将无法获得该文件。另一个测试是使用 subprocess
,为此我遇到了权限错误:
OSError: [Errno 13] Permission denied
我怀疑这可能是因为 .py 文件没有可执行权限。但是,让每个文件都成为可执行文件是另一个问题。
在列表中执行 python 文件的正确方法是什么?
编辑:更具体
当转到我的 jupyter notebook 上的特定目录并执行文件时
!python file1.py
它工作正常,但是在使用列表时我得到了
for fname in pylist:
!python fname
python: can't open file 'fname': [Errno 2] No such file or directory
所以看起来 python 并没有读取列表中的元素,而是试图执行 fname
。我检查了 os.path.abspath(fname)
路径是否正确。
最佳答案
您的循环存在一些问题。没有必要获取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
关于python-2.7 - 从列表中执行 python 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834631/