【问题标题】:how to execute nested python files如何执行嵌套的python文件
【发布时间】:2012-02-25 12:21:47
【问题描述】:

我有 3 个 python 文件。(first.py、second.py、third.py)我正在从第一个 python 文件执行第二个 python 文件。第二个python文件使用'import'语句来使用第三个python文件。这就是我正在做的事情。 这是我的代码。

first.py

import os
file_path = "folder\second.py" 
os.system(file_path)

second.py

import third
...
(rest of the code)

third.py(包含ReportLab生成PDF的代码)

....
canvas.drawImage('xyz.jpg',0.2*inch, 7.65*inch, width=w*scale, height=h*scale)
....

当我执行这段代码时,它给出了错误

IOError: Cannot open resource "xyz.jpg"

但是当我通过写 python second.py 直接执行 second.py 文件时,一切正常..!!

即使我尝试过这段代码,

file_path = "folder\second.py" 
execfile(file_path)

但它给出了这个错误,

ImportError: No module named third

但正如我所说,如果我直接执行 second.py 文件,一切正常。 !!

为什么会这样?执行这种嵌套的python文件有更好的主意吗? 任何想法或建议将不胜感激。

我使用这三个文件只是为了给出我的结构的基本概念。您可以将此执行流程视为单个流程。这样的进程太多了,每个文件都包含千行代码。这就是为什么我不能将整个代码更改为模块化,可以由 import 语句使用。 :-( 所以问题是如何制作一个 python 文件来负责执行所有其他进程。 (如果我们单独执行每个进程,一切正常)

【问题讨论】:

  • 这是从单独的模块构建 Python 应用程序的一种非常糟糕的方法。使用os.system 运行另一个python 脚本是相当愚蠢的。 execfile 稍微好一点。最好是导入。您确实应该重做您的设计,以便您的各种模块具有可以导入和调用的功能,而不是继续尝试使其工作。
  • 我对 os.system 调用的目的感到困惑,但实际上您应该导入其他 python 模块来执行它们,而不是跳出 shell 并运行它们。
  • 不确定它是否与您的问题有关,但您的文件名字符串中的反斜杠应该加倍,否则它们将被解释为字符串转义字符而不引用预期的文件。

标签: python


【解决方案1】:

如果你做对了,这应该很容易。您可以按照几个步骤进行设置。

第 1 步:设置要运行或导入的文件

#!/usr/bin/env python

def main():
    do_stuff()

if __name__ == '__main__':

__name__ special variable 在作为脚本调用时将包含 __main__,如果导入则包含模块名称。您可以使用它来提供可以使用任何一种方式的文件。


第 2 步:将您的子目录设为包

如果您将一个名为__init__.py 的空文件添加到folder,它会变成您可以导入的package


第 3 步:导入并运行您的脚本

from folder import first, second, third

first.main()
second.main()
third.main()

【讨论】:

    【解决方案2】:

    你做事的方式是无效的。

    您应该:创建一个主应用程序,然后导入 1、2、3。

    在 1,2,3 中:您应该将事物定义为您的函数。然后从主应用程序调用它们。

    恕我直言:我不需要您将太多代码放入单独的文件中,您只需将它们放入一个带有函数定义的文件中并正确调用它们即可。

    【讨论】:

      【解决方案3】:

      我支持 S.Lott:你真的应该重新考虑你的设计。

      但只是为您的具体问题提供答案: 据我目前的猜测,folder 中有 second.py 和third.py,还有xyz.jpg。要完成这项工作,您必须先更改工作目录。在first.py这样试试:

      import os
      ....
      os.chdir('folder')
      execfile('second.py')
      

      尝试阅读os module

      【讨论】:

      • 非常感谢 Markus 的回答。但不幸的是,这段代码不适用于我的情况。
      【解决方案4】:

      未来的读者:

      Pradyumna 的回答 from here 为我解决了 Moin Ahmed 的第二个问题:

      import sys,通过在运行期间附加路径来更改“sys.path” 时间,然后导入有帮助的模块

      [即sys.path.append(execfile的目录)]

      【讨论】:

        猜你喜欢
        • 2019-10-19
        • 2018-04-28
        • 2019-08-05
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多