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

时间:2014-02-22 19:55:32

标签: python

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

使用带有“python -i c:\ X \ Y \ Z \ filename.py”的windows run命令时,我可以调用测试脚本,运行正常。但是我希望能够通过“>>>”在Python终端上调用它。提示。

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

由于

5 个答案:

答案 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了解有关魔术功能的更多信息。

顺便说一句,它甚至可以自动完成文件名。