Python脚本在Linux中无法运行
我有一个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 个回答
os.listdir(dir_name)
这个命令会返回指定目录下的文件名,这些文件名是相对于你给的目录来说的。如果你想在其他命令中使用这些文件名,你需要在文件名前面加上目录名(可以在循环开始时用 f = os.path.join(to_backup, f)
来实现),或者在开始循环之前先把工作目录切换到备份目录。
这就是 dr jimbob 的回答中提到的前两种方法。
在我的电脑上(ubuntu 10.10)是可以运行的。可能是因为/home/vmware/tobackup这个文件夹是空的,或者你没有权限去读取它。
好的,你有权限,但你在列出文件时不在正确的目录。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
并不存在,所以你没有任何输出。