Python脚本在Linux中无法运行

-1 投票
3 回答
3053 浏览
提问于 2025-04-16 18:02

我有一个Python脚本

#!/usr/bin/env python
import datetime, os
from time import gmtime, strftime

to_backup = "/home/vmware/tobackup"
var1 = datetime.datetime.now().strftime('%b-%d-%I%p')
for f in os.listdir(to_backup):
    if(os.path.isfile(f)):
        print f + " is a file"
    if(os.path.isdir(f)):
        print f + " is a directory"

它给我的输出是空的。我不知道问题出在哪里

这是针对dr jimbob的回答的输出

total 36
-rwxrwxr-x 1 vmware vmware  440 May  5 07:41 back.py
-rwxrwxr-x 1 vmware vmware 2624 May  4 20:35 backup.sh
drwxr-xr-x 2 vmware vmware 4096 Jun 22  2010 Desktop
drwxrwxr-x 2 vmware vmware 4096 May  5 03:51 destination
drwxr-xr-x 2 root   root   4096 May  4 18:49 public_html
drwxrwxr-x 2 vmware vmware 4096 May  1 07:47 python
-rwxrwxr-x 1 vmware vmware  560 May  1 13:20 regex.py
drwxrwxrwx 7 vmware vmware 4096 May  5 03:50 tobackup
total 20
drwxrwxrwx 2 vmware vmware 4096 May  5 03:50 five
drwxrwxrwx 2 vmware vmware 4096 May  5 03:50 four
drwxrwxrwx 2 vmware vmware 4096 May  5 03:50 one
drwxrwxrwx 2 vmware vmware 4096 May  5 03:50 three
drwxrwxrwx 2 vmware vmware 4096 May  5 03:50 two

3 个回答

2

os.listdir(dir_name) 这个命令会返回指定目录下的文件名,这些文件名是相对于你给的目录来说的。如果你想在其他命令中使用这些文件名,你需要在文件名前面加上目录名(可以在循环开始时用 f = os.path.join(to_backup, f) 来实现),或者在开始循环之前先把工作目录切换到备份目录。

这就是 dr jimbob 的回答中提到的前两种方法。

4

在我的电脑上(ubuntu 10.10)是可以运行的。可能是因为/home/vmware/tobackup这个文件夹是空的,或者你没有权限去读取它。

5

好的,你有权限,但你在列出文件时不在正确的目录。list_dir会给你一个没有路径的文件和文件夹的列表,而os.path.isfile('one')os.path.isdir('one')会检查当前目录下是否存在名为'one'的文件夹(当前目录是你运行脚本的地方,除非你用os.chdir明确改变了目录,或者包含了路径,比如os.path.isdir('/home/vmware/tobackup/one'))。

#!/usr/bin/env python
import datetime, os
from time import gmtime, strftime
import subprocess

to_backup = "/home/vmware/tobackup"
var1 = datetime.datetime.now().strftime('%b-%d-%I%p')

os.chdir(to_backup)
# os.listdir(to_backup) = ['one', 'two', 'three', 'four', 'five']
for f in os.listdir(to_backup):
    if(os.path.isfile(f)):
        print f + " is a file"
    if(os.path.isdir(f)):
        print f + " is a directory"

或者

to_backup = "/home/vmware/tobackup"
var1 = datetime.datetime.now().strftime('%b-%d-%I%p')
# os.listdir(to_backup) = ['one', 'two', 'three', 'four', 'five']
for f in os.listdir(to_backup):
    if(os.path.isfile(os.path.join(to_backup,f))):
        print f + " is a file"
    if(os.path.isdir(os.path.join(to_backup,f))):
        print f + " is a directory"

或者用walk(但实际上并没有遍历子目录)。

to_backup = "/home/vmware/tobackup"
var1 = datetime.datetime.now().strftime('%b-%d-%I%p')

root, dirs, files in os.walk(to_backup).next()
for file in files:
    print f + " is a file in " + root
for dir in dirs:
    print f + " is a directory"

编辑:为了更清楚,原始脚本的错误在于你的文件结构是这样的:

/home/user/bin/your_script.py
/home/vmware/tobackup/
/home/vmware/tobackup/one
/home/vmware/tobackup/two
...

当你去到/home/user/bin运行你的脚本(例如,python your_script.py)时,os.listdir('/home/vmware/tobackup')会给你一个在/home/vmware/tobackup目录下的文件和文件夹名称的列表,也就是['one','two', ...]。但是,当你在/home/user/bin目录下执行os.path.isfile('one')时,你实际上是在检查/home/user/bin/one是否是一个文件,而不是检查/home/vmware/tobackup/one是否是一个文件。由于/home/user/bin/one并不存在,所以你没有任何输出。

撰写回答