如何在一个不同的目录中运行Python文件,而这个文件是由另一个Python文件调用的?

3

在我的 Python 程序中,我生成了以下字符串:

"D:\something_else.py"

假设 D 盘上面有其他资源是 something_else.py 需要的。

如何从我的代码中运行 something_else.py 呢?我的代码是从 C:\Users\Someone\Desktop 运行的。

现在我正在使用以下代码:

from subprocess import call 
call(["python",pythloc])

这给我带来了一个错误,因为它只能找到something_else.py,并且无法找到something_else.py需要的其他资源,这些资源与something_else.py在同一个文件夹中。


1
你的文件夹中有 __init__.py 吗? - Vaibhav Vishal
3
call命令中设置当前工作目录:call([xxx], cwd="D:\\") - Sraw
1
将pythloc更改为绝对路径,以调用您想要调用的Python文件。如果要使用相对路径,请使用os.Path(__file__)来构建您的路径。这将显示您正在运行的Python文件的位置。 - E.Serra
1
你有什么资源,例如"D:\images\*.jpg"吗?看起来你最好让something_else.py更聪明一些,知道在哪里查找资源,但是不知道它们的性质(它们是否与something_else.py在同一个目录中?子目录中?)。 - jgreve
@E.Serra pythoc是绝对文件路径,但是由于通过call生成的子进程的cwd是当前程序运行的位置,因此无法看到somethingelse.py将使用的任何资源。 - glopquestions
显示剩余3条评论
2个回答

3
除了需要小心使用“\”和使用“:”的不同之外,还有以下注意事项:
   locationDir="D:\something_else.py"

在字符串前加上 r:

   locationDir=r"D:\something_else.py"

您可以简单地设置PYTHONPATH环境变量,将其指向其他模块所在的目录。

有关更多信息,请参见此处:

https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH


1
和我一样。看起来是有人在进行“点踩然后溜走”的表演。如果点踩者能留下评论说明问题所在,不仅可以帮助回答者改进回答,也对后来阅读的人有所帮助,我个人会非常感激。 - Tushar
2
同意“为什么要用踩”,我认为它们两个都很不错,所以+1。我刚刚经历了各种头疼的事情,试图理解这个问题,似乎你们两个都解释得非常好和简明。 (最终我自己使用PYTHONPATH,因为我有很多调用东西的shell脚本,所以这似乎比在python代码中调整sys.path要清晰一些。如果我只有*.py文件,我可能会调整sys.path) - jgreve
1
啊,我刚看到OP关于“其他资源”的部分,所以显然@glopquestions想要调用的“somethingelse”代码假设这些资源在与“somethingelse”所处的位置有关。这让我想到另一个程序需要更聪明地查找这些资源。 - jgreve
@NabilGhodbane 感谢您的回答!您的方法通常有效,但不适用于我的特定用例,因为somethingelse.py旨在驻留在不同的驱动器和不同的位置。不确定为什么您被投票否决,这是一个好的解决方案。 - glopquestions

2

如果您可以将提到的文件夹作为项目本身的一部分,只需要在文件夹中添加一个名为 __init__.py 的空文件,就可以将其转换为Python包。

如果它位于其他路径如"D:\some_directory\",该路径下除了其他依赖项外还有something_else.py,请在导入语句中执行以下操作:

sys.path.append(r"D:\some_directory\")
from something_else import some_useful_function, some_useful_class

它将把提到的目录添加到您的sys.path中,然后您可以从那里导入任何Python文件并像往常一样调用函数。如果您使用任何IDE(如PyCharm),它可能仍会显示第2行的未解决错误作为导入检查的一部分。但是当您运行代码时,代码将简单地工作。当您可以只导入和调用函数时,从其他(python something.py)调用Python脚本几乎永远不是一个好主意,因为这样可以更好地控制和检查错误。

1
如果投反对票的人也能指出不同意的原因,那就太好了。 - Tushar
1
再次强调,我不确定为什么你的回答被点了踩——这是一种通过完全消除问题来解决问题的方法。我可以看到这个特定的变通方法可以起作用,但对于我的使用情况绝对不是一个选项,因为从somethingelse.py中导入单个函数和类对我来说绝对不是一个选项。 - glopquestions
是的,不用在意那个踩票。谁曾经踩过这些答案,可能并不想回来读评论。 :D 顺便说一下,如果对你有用,你可以在something_else.py中拥有一个主函数,它基本上做的和你的脚本一样。只是想强调一下,调用函数可以让你在错误检查等方面更加掌控。但你显然是你自己使用情况的最佳判断者。 - Tushar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接