从Python解释器中的特定文件路径调用.py脚本

Bio*_*a41 5 python

我刚刚开始使用Python.
在交互模式下的Python解释器命令行中,如何从C:\ X\Y\Z目录调用测试脚本?当文件不在当前工作目录中时,如何指定文件的完整路径?

当使用带有"python -ic:\ X\Y\Z\filename.py"的windows run命令时,我可以调用一个测试脚本,它运行正常.但是我希望能够通过">>>"提示符在Python终端中调用它.

(我搜索和搜索了两个小时,找不到答案,虽然看起来这对初学者来说应该是一个常见的问题而且很容易做到.)

谢谢

Fil*_*zak 1

执行一下吧

Python 2.x:

execfile("C:\\X\Y\\Z")
Run Code Online (Sandbox Code Playgroud)

Python 3+:

with open("C:\\X\Y\\Z", "r") as f:
    exec(f.read())
Run Code Online (Sandbox Code Playgroud)

尽管如此,这是非常糟糕的做法 - 它从字符串执行代码(在某些时候),而不是使用首选且更安全的方式导入模块。不过,当您导入模块并在“:”之后添加其一些代码时-f __name__ == '__main__',这些部分将无法工作(因为__name__在导入的模块中不会工作__main__,如果您将其作为单个脚本运行,则它会工作)。

出于多种原因,它很糟糕,在某种意义上与 Python 之禅密切相关,但如果您是初学者,这应该对您有所帮助:

当你在交互模式下做任何事情时,你都会在一些命名空间上工作(这个术语对于理解Python非常重要,如果你不知道它,请在Python语言参考中检查它)。当您exec()/execfile()不提供globals()/时locals(),您可能会得到修改后的命名空间。

修改命名空间?

这是什么意思?让我们有一个这样的脚本:

radius = 3
def field_of_circle(r):
    return r*r*3.14
print(field_of_circle(radius))
Run Code Online (Sandbox Code Playgroud)

现在,您有以下会话:

>>>radius = 5
>>>execfile("script_above.py")
28.26
>>>print(radius)
3
Run Code Online (Sandbox Code Playgroud)

你看到会发生什么吗?您在交互式会话中定义的变量将被脚本末尾的值覆盖。修改已导入的外部模块也是如此。让我们有一个非常简单的模块:

x = 1
Run Code Online (Sandbox Code Playgroud)

并执行脚本:

import very_simple_module
very_simple_module.x = 3
Run Code Online (Sandbox Code Playgroud)

现在,这是一个解释器交互会话:

>>>import very_simple_module
>>>print(very_simple_module.x)
1
>>>execfile("executed_script.py")
>>>print(very_simple_module.x)
3
Run Code Online (Sandbox Code Playgroud)

运行另一个解释器

交互式会话对于很多事情都非常有用,但对于很多事情却没有什么用处,但运行 python 脚本并不是其中之一。

除非...你想玩得坚强并使用 python shell 作为系统 shell。然后,您可以使用 subprocess (在标准库中)或 sh (可以在 PyPI 上找到):

>>>import subprocess
>>>subprocess.call(["python", "C:\\X\Y\\Z"], shell=True)
>>>from sh import python
>>>python("C:\\X\Y\\Z")
Run Code Online (Sandbox Code Playgroud)

修改交互式解释器命名空间不会有这个问题

将脚本视为模块

另外,还有一种选择:在交互式会话中将带有脚本的目录添加到 pythonpath,并导入名为 script 的模块:

>>>import sys
>>>if "C:\\X\\Y" not in sys.path:
    sys.path.append("C:\\X\\Y")
>>>import Z
Run Code Online (Sandbox Code Playgroud)

请记住,启动解释器的目录自动位于 pythonpath 上,因此如果您在与脚本相同的目录中运行 python,则只需使用上面的第三行。

解释器命名空间不会改变,但“ -f __name__ == '__main__':”后面的代码不会被执行。您仍然可以访问脚本变量:

>>>radius = 5
>>>import first_example_script
>>>print(radius)
5
>>>print(first_example_script.radius)
3
Run Code Online (Sandbox Code Playgroud)

此外,模块名称可能会发生冲突。例如,如果您的脚本是 sys.py,那么此解决方案将起作用,因为 python 会在您的脚本之前导入内置sys模块。