Python:操作系统错误:[Errno 2] 没有此类文件或目录:''

22

我有一个100行、3年历史的Python爬虫程序,现在出现了bug。其中前几行如下:

import urllib, re, os, sys, time    # line 1: import modules
os.chdir(os.path.dirname(sys.argv[0])) # line 2: all works in script's folder > relative address
# (rest of my script here!)

执行时,

$cd /my/folder/
$python script.py

我收到了以下错误:

python script.py 
Traceback (most recent call last):
  File "script.py", line 2, in <module>
    os.chdir(os.path.dirname(sys.argv[0]))
OSError: [Errno 2] No such file or directory: ''

我该如何阅读这个错误信息以及应该怎么做?

5个回答

34

你是否注意到,如果你运行以下代码,就不会出现错误:

python ./script.py

取代

python script.py

这是因为在前一种情况下,sys.argv[0]将读取./script.py,这会给os.path.dirname提供工作路径。当您不指定路径时,sys.argv[0]仅读取script.py,并且os.path.dirname无法确定路径。


30

我遇到这个错误是因为我向subprocess.call提供了字符串参数而不是参数数组。为了避免这种情况,请使用shlex.split

import shlex, subprocess
command_line = "ls -a"
args = shlex.split(command_line)
p = subprocess.Popen(args)

2
谢谢。在Python 2.7中是必需的,但在Python 3中不再需要。 - Nasif Imtiaz Ohi
我也遇到了同样的错误,但我尝试使用 shlex.split 并将数组传递给 subprocess.popen。我想要做的是在 Linux 中切换到一个新目录并在一个新的 shell 中运行一个 Python 脚本。command_to_run=shlex.split("cd .. && cd Adapter_Main && python2 client.py") subprocess.Popen(command_to_run,stdout=subprocess.PIPE)这全部都是在 Python2 中,并且我得到了 OS 错误。没有这个文件或目录。我已经在普通 shell 中检查了该命令,这个命令绝对是正确的。 - Dhruv Marwha

19

使用os.path.abspath()函数:

os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))

sys.argv[0] 在这种情况下只是一个脚本名称,没有目录,所以os.path.dirname() 返回一个空字符串。

os.path.abspath() 将其转换为带有目录名的正确绝对路径。


可能是在复活一个旧帖子,但我想要补充说这个答案非常有趣。我有两个脚本在同一个文件夹中,使用相同的权限和argparse,并且可以通过CLI执行。其中一个没有任何问题,但另一个给出了相同的“找不到文件或目录”的错误。如果我使用你的解决方案,我可以通过python foo.py来运行有问题的脚本,但不能通过./foo.py来运行它。我非常好奇为什么会这样。 - Kamikaze Rusher
@KamikazeRusher:我也想帮忙,但是没有更多的细节,我无法在这方面提供帮助。也许你可以把这个问题发表为一个新的问题? - Martijn Pieters
我认为无论如何我也不能提供更多的细节了。谢谢您的回复,但是我认为目前这个问题并不重要,还不值得单独提出一个问题。我只是觉得即使在相同的情况下,仍然可以发现这样的不一致性,这很有趣。 - Kamikaze Rusher
@KamikazeRusher:如果你得到明显不一致的结果,我会对这些情况是否相同提出异议。两种情况之间肯定有所不同! - Martijn Pieters

0

尝试使用otatools命令:m -j otatools,这在我的情况下有效。

运行m -j otatools命令会启动构建过程,用于创建基于AOSP源代码构建的Android ROM的OTA更新包。


-1

我在Ubuntu 14.04上编译Android代码v4.4时,遇到了Python的同样问题:没有这个文件或目录。

最终,我安装了以下库解决了问题。因此,我认为这可能会在某些情况下帮助到其他人。Python脚本默认假定系统中存在某些库。

sudo apt install gperf
sudo apt install  libxml2-utils
sudo apt install libbison-dev


你的特定用例和错误与此处呈现的无关... 需要安装外部库来解决这个问题毫无意义... 查看已接受的答案以了解此处的问题是什么... - Tomerikoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接