【问题标题】:How to use exec() with new lines in Python?如何在 Python 中将 exec() 与新行一起使用?
【发布时间】:2017-09-05 19:00:24
【问题描述】:

我有一个网站,它只发送几行 Python。我使用请求连接到该站点并获取它,但其中包含 \n。这是我的意思的一个例子:

import requests
r = r.get("www.example.com")
t = r.text
exec(t)

变量 t 有新行。这是错误:

>>> exec(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    import time\nprint(time.time())
                              ^
SyntaxError: unexpected character after line continuation character

另一件事:在从中检索它的网页上,它是一个\n,但t的值有\n而不是\n。我不确定我能做些什么来解决这个问题。

【问题讨论】:

  • 执行从 get 请求返回的 python 代码听起来很糟糕
  • 这是我自己的网站。
  • 您的请求文本包含换行符。可能它包含反斜杠文字,后跟 n.
  • 正如其他评论者所说,执行浏览器发送的 Python 代码是一个非常糟糕的主意,即使它是您自己的站点。仅仅因为它是您自己的网站不会阻止邪恶的人阅读您的 HTML 和/或 Javascript,弄清楚它向您的服务器发送的请求,并编写他们自己从未预料到的版本。唯一安全的情况是,如果它是仅具有本地访问权限的测试原型,并且您是唯一的用户。

标签: python python-3.x python-requests newline


【解决方案1】:

如果您的字符串实际上包含换行符,则可以正常工作。您从服务器返回的字符串甚至不包含换行符 - 它实际上包含“\n”。请参见下面的示例:

>>> t = 'import time\\nprint(time.time())'
>>> exec(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    import time\nprint(time.time())
                                  ^
SyntaxError: unexpected character after line continuation character
>>> t = 'import time\nprint(time.time())'
>>> exec(t)
1491841224.27

请注意第一行如何包含文字“\n”,而第二次定义t 我实际上使用了一个真正的换行符。在第一个示例中,它给出了与您得到的完全相同的错误,让我相信这是您的问题。

因此,要解决此问题,您要么必须修改服务器(因为您声称它是您的网站)以返回带有实际换行符的数据,或者,如果您不想(或不能)修改服务器,您将不得不用实际的换行符或分号替换“\n”。一种方法是t.replace('\\n', '\n')。因此,如果您决定以这种迂回的方式修复它,您的代码将如下所示:

import requests
r = r.get("www.example.com")
t = r.text
exec(t.replace('\\n', '\n'))

但是,如果您修复了网站,您的代码可能看起来与您的问题中的完全相同并且可以正常工作。

【讨论】:

  • OP 也要求修复。即t.replace('\\n', '\n')
  • 谢谢。它解决了我的问题。但是,我该如何修复该网站?我的意思是文字 \n 和换行符有什么区别?
  • @apoorlydrawnape 我不知道,因为你还没有发布你网站的代码或类似的东西。无论如何,这完全超出了这个问题的范围。如果您需要帮助,请使用相关标签和代码提出新问题。此外,“\n”只是两个字符的序列。换行符是一个二进制值,在某些编程语言中可以表示为“\n”。
  • 好的。只要这行得通,现在就没有必要了。
猜你喜欢
  • 1970-01-01
  • 2012-09-09
  • 2010-10-26
  • 2011-06-27
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多