我刚刚开始使用Python.
在交互模式下的Python解释器命令行中,如何从C:\ X\Y\Z目录调用测试脚本?当文件不在当前工作目录中时,如何指定文件的完整路径?
当使用带有"python -ic:\ X\Y\Z\filename.py"的windows run命令时,我可以调用一个测试脚本,它运行正常.但是我希望能够通过">>>"提示符在Python终端中调用它.
(我搜索和搜索了两个小时,找不到答案,虽然看起来这对初学者来说应该是一个常见的问题而且很容易做到.)
谢谢
执行一下吧
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模块。
| 归档时间: |
|
| 查看次数: |
2440 次 |
| 最近记录: |