我刚刚开始使用Python 在交互模式下的Python解释器命令行中,如何从C:\ X \ Y \ Z目录调用测试脚本?当文件不在当前工作目录中时,如何指定文件的完整路径?
使用带有“python -i c:\ X \ Y \ Z \ filename.py”的windows run命令时,我可以调用测试脚本,运行正常。但是我希望能够通过“>>>”在Python终端上调用它。提示。
(我搜索并搜索了两个小时但找不到答案,虽然看起来它对初学者来说应该是一个常见的问题而且很容易做到。)
由于
答案 0 :(得分:3)
由于您对文件路径使用反斜杠,因此python将这些解释为“转义字符”。在Python中编写文件路径时,请确保使用正斜杠。
with open("C:/X/Y/Z/filename.py", "r") as file:
exec(file.read())
双反斜杠也可以,但我更喜欢正斜面的清洁外观。
答案 1 :(得分:2)
如果要将其导入REPL:
import sys
sys.path.append('c:\X\Y\Z')
import filename
答案 2 :(得分:1)
执行它
Python 2.x:
execfile("C:\\X\Y\\Z")
Python 3 +:
with open("C:\\X\Y\\Z", "r") as f:
exec(f.read())
尽管如此,这是非常糟糕的做法 - 它从字符串执行代码(在某些时候),而不是使用首选和更安全的导入模块的方式。但是,当您导入模块并在“-f __name__ == '__main__'
:”后面添加一些代码时,这些部分将无效(因为导入模块中的__name__
不会是__main__
,而且如果你把它作为单个脚本运行的话会。)
这有很多原因,在某种意义上与Python的Zen有很强的联系,但如果你是初学者,这应该对你说:
当你在交互模式下做任何事情时,你会处理一些命名空间(这个术语对于理解python非常重要,如果你不知道它,请在python语言参考中检查它)。如果您exec()
/ execfile()
未提供globals()
/ locals()
,则最终可能会修改名称空间。
修改后的命名空间?
这是什么意思?让我们有一个这样的脚本:
radius = 3
def field_of_circle(r):
return r*r*3.14
print(field_of_circle(radius))
现在,您有以下会话:
>>>radius = 5
>>>execfile("script_above.py")
28.26
>>>print(radius)
3
你看到会发生什么?您在交互式会话中定义的变量将被脚本末尾的值覆盖。修改已导入的外部模块也是如此。让我们有一个非常简单的模块:
x = 1
并执行脚本:
import very_simple_module
very_simple_module.x = 3
现在,这是一个解释器交互式会话:
>>>import very_simple_module
>>>print(very_simple_module.x)
1
>>>execfile("executed_script.py")
>>>print(very_simple_module.x)
3
运行另一个解释器
交互式会话对许多事情非常有用,但对许多事情都没有用,但是运行python脚本不是其中之一。
除非......你想玩顽强并使用python shell作为系统shell。然后,您可以使用subprocess(在标准库中)或sh(可以找到on PyPI):
>>>import subprocess
>>>subprocess.call(["python", "C:\\X\Y\\Z"], shell=True)
>>>from sh import python
>>>python("C:\\X\Y\\Z")
修改交互式解释器命名空间
时不会有这个问题将脚本视为模块
此外,还有一个选项:在交互式会话中添加带有脚本的目录到pythonpath,以及导入模块命名为script:
>>>import sys
>>>if "C:\\X\\Y" not in sys.path:
sys.path.append("C:\\X\\Y")
>>>import Z
请记住启动解释器的目录自动在pythonpath上,所以如果你在与脚本相同的目录中运行python,你只需要使用上面的第3行。
解释器命名空间不会更改,但“-f __name__ == '__main__'
:”之后的代码将不会执行。您仍然可以访问脚本变量:
>>>radius = 5
>>>import first_example_script
>>>print(radius)
5
>>>print(first_example_script.radius)
3
此外,您可以使模块名称冲突。例如,如果您的脚本是sys.py,那么此解决方案将起作用,因为python将在您之前导入builtin sys
模块。
答案 3 :(得分:1)
如果要从解释器中的文件执行代码,可以使用execfile
execfile('C:/X/Y/Z/filename.py')
(/
在所有操作系统中用作路径分隔符,如果使用\
,则需要转义它们('C:\\X\\Y\\Z\\filename.py'
)或使用原始字符串文字(r'C:\X\Y\Z\filename.py'
))
答案 4 :(得分:1)
如果您正在使用IPython(并且您应该使用它,它比vanilla交互式Python更有用),您可以使用魔术函数run
(或使用%
前缀:{{ 1}}):
%run
See this link了解有关魔术功能的更多信息。
顺便说一句,它甚至可以自动完成文件名。