【问题标题】:Execute python files from a list从列表中执行 python 文件
【发布时间】:2018-07-27 19:50:26
【问题描述】:

我使用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 notebook 上的特定目录并执行文件时

!python file1.py

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

for fname in pylist:    
    !python fname

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

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

【问题讨论】:

    标签: python-2.7 subprocess execfile


    【解决方案1】:

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

    import subprocess
    
    files = ['./py1.py', './py2.py']
    
    for fname in files:
    
        subprocess.call([fname])
    
    
    print("done")
    

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

    #!/usr/bin/env python
    
    # py1.py
    print("test 1")
    

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

    >>>import py1
    test 1
    

    【讨论】:

    • 你给你的py1和py2权限了吗?例如chmod +x py1.py?因为这对我不起作用,所以我收到“权限被拒绝”错误。
    • 我没有明确地授予文件权限,但是经过检查,它们似乎都具有 exe 权限。它一定是继承了它。
    • 可能是一个菜鸟问题,但是当我从与 test.py 相同目录中的脚本运行 subprocess.call("test.py") 时,它会给出一个关于找不到文件的错误。更明确地说,我在同一个目录中有 caller.py 和 test.py,调用者正在运行上面的代码。知道我做错了什么吗?
    • 天啊,我确实是个菜鸟。对于未来的读者:subprocess.call(['python', 'test.py'])。需要调用 python 来运行它,因为它不在路径中。
    猜你喜欢
    • 2021-03-06
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多