我正在尝试使用此Python urllib2 Basic Auth Problem位代码从需要身份验证的网址下载网页内容。我正在尝试的代码是:
import urllib2, base64
request = urllib2.Request("http://api.foursquare.com/v1/user")
base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
result = urllib2.urlopen(request)
它告诉我:
./xx.py: line 1: import: command not found
./xx.py: line 3: syntax error near unexpected token `('
./xx.py: line 3: `request = urllib2.Request("http://api.foursquare.com/v1/user")'
我想知道我做错了什么?我正在使用Python 2.7.5
。如何从需要身份验证的URL下载文件内容?
答案 0 :(得分:44)
这不是第一步与身份验证相关的问题。您的import
无效。所以,试着在第一行写这个:
#!/usr/bin/python
并暂时使用
运行python xx.py
对你来说这是一个解释:
>>> abc = "Hei Buddy"
>>> print "%s" %abc
Hei Buddy
>>>
>>> print "%s" %xyz
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
print "%s" %xyz
NameError: name 'xyz' is not defined
首先,我初始化了abc变量,它运行正常。另一方面,xyz不起作用,因为它没有初始化!
答案 1 :(得分:9)
您使用的是基于UNIX的操作系统,例如Linux吗?如果是这样,请在脚本的最顶部添加 shebang 行:
#!/usr/bin/python
在其下方,您将获得已有的其余代码(在您的情况下为xx.py
)。然后在终端运行相同的命令:
$ python xx.py
这应该可以正常工作,因为它现在将其解释为Python代码。但是,当从终端运行时,这并不重要,因为python
告诉如何在这里解释它。它允许你做的是在终端外执行它,即从文件浏览器执行它。
答案 2 :(得分:4)
当您看到&#34; import:命令未找到&#34;在第一次导入时,它是由解析器不使用与py文件匹配的字符编码引起的。特别是当您不在py文件中使用ASCII编码时。
正确的方法是在py文件的顶部指定正确的编码,以匹配您的文件字符编码。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
答案 3 :(得分:1)
如果您直接运行脚本,例如./xx.py
,并且您的脚本在顶部没有诸如#!/usr/bin/env python
之类的shebang,那么您的shell可能会将其作为shell脚本执行。 POSIX says:
如果execl()函数由于等效的错误而失败 系统接口卷中定义的[ENOEXEC]错误 POSIX.1-2008,shell应该执行一个等同于一个命令的命令 shell使用搜索结果生成的路径名作为第一个调用 操作数,除了传递给新shell的任何剩余参数 可以将新shell中的“$ 0”值设置为该命令 名称。如果可执行文件不是文本文件,则shell可能会绕过 这个命令执行。在这种情况下,它应写一条错误信息, 并应退回126的退出状态。
注意:如果您的文本文件没有shebang,则可能会获得ENOEXEC
。
如果没有shebang,shell会尝试将您的Python脚本作为shell脚本运行,从而导致错误:import: command not found
。
此外,如果您将脚本作为python xx.py
运行,那么您不需要shebang。您甚至不需要它可执行(+x
)。在这种情况下,您的脚本由python
解释。
在Windows上,除非pylauncher is installed,否则不会使用shebang。它是included in Python 3.3+。
答案 4 :(得分:1)
我遇到了同样的问题,现在我找到了解决这个问题的方法。
#!/usr/bin/python
import sys
import os
os.system('meld "%s" "%s"' % (sys.argv[2], sys.argv[5]))
这是我案例的代码[1]。当我尝试这个脚本时,我收到了如下错误消息:
导入:未找到命令
我发现人们谈论了shebang。如你所见,我上面的python代码中有shebang。 我尝试了这些和那些试验,但没有找到一个好的解决方案。
我终于试着打电话给我自己。
#!/usr/bin/python
并删除了复制的。
我的问题解决了!!!
我从互联网上复制了代码[1]。
我猜在原始复制的shebang声明中有一些看不见的(?)看不见的特殊字符。
我使用vim,有时我会遇到类似的问题。特别是当我从互联网上复制一些代码片段时,会出现这种问题..网页上有一些病毒特殊字符!!我怀疑。 : - )
Journeyer
PS)我将Windows 7中的代码 - 主机操作系统 - 复制到Windows剪贴板中并将其粘贴到我在vbu中的Ubuntu - 来宾操作系统中。 VM是Oracle虚拟机。
[1] http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
答案 5 :(得分:1)