首页 > 解决方案 > 如何在完全不同的项目中从 .py 文件运行 .py 文件

问题描述

对于我的生活,我无法弄清楚这一点。

我在 python 中构建了 2 个应用程序,因此 2 个项目位于不同的文件夹中,在第一个应用程序中是否有命令要说,例如 run file2 from documents/project2/test2.py ?

我尝试了 os.system('') 和 exec() 之类的东西,但这似乎只有在同一个文件夹中才有效。我怎样才能给命令一个路径,如documents/project2,然后例如: exec(documents/project2 python test2.py) ?

精简版:

当 test2 位于完全不同的文件/项目中时,是否有运行 python test2.py 的命令?

谢谢所有的反馈!

标签: pythonpython-3.xpython-2.7pycharm

解决方案


有很多方法可以采取。

1 - 导入 .py

如果其他 Python 脚本的路径可以相对于您的项目,您可以简单地导入 .py。这将导致脚本“根”级别的所有代码被执行,并使函数以及类型和变量定义可用于导入它的脚本。

当然,这仅在您控制所有内容的安装方式和位置时才有效。这是最可取的解决方案,但仅在有限的情况下有效。

import ..other_package.myscript

2 - 评估代码

您可以像任何其他文本文件一样加载 Python 文件的内容并执行这些内容。这被认为是更大的安全风险,但考虑到 Python 在正常使用中的解释性质,并不比正常情况下的导入差多少。

就是这样:

with open('/path/to/myscript.py', 'r') as f:
    exec(f.read())

请注意,如果您需要将值传递给脚本内部或外部的代码,您可能希望在这种情况下使用文件。

我认为这是最不受欢迎的解决方案,因为它有点不灵活且不是很安全,但它绝对很容易设置。

3 - 像任何其他外部程序一样调用它

从 Python 脚本中,您可以调用任何其他可执行文件,其中包括 Python 本身和另一个脚本。

就是这样:

from subprocess import run

run('python path/to/myscript.py')

这通常是最好的方法。您可以使用命令行与脚本交互,并捕获输出。

您还可以使用 ,直接使用管道输入文本stdin=或捕获脚本的输出。stdout=subprocess.Popen

例如,以这个脚本为例,称为quote.py

import sys

text = sys.stdin.read()

print(f'In the words of the poet:\n"{text}"')

这会从标准输入中获取任何文本,并使用一些额外的文本将它们打印到标准输出中,就像任何 Python 脚本一样。你可以这样称呼它:

dir | python quote.py

要从另一个 Python 脚本中使用它:

from subprocess import Popen, PIPE

s_in = b'something to say\nright here\non three lines'
p = Popen(['python', 'quote.py'], stdin=PIPE, stdout=PIPE)
s_out, _ = p.communicate(s_in)

print('Here is what the script produced:\n\n', s_out.decode())

推荐阅读