Python脚本在linux中不工作

Python脚本在linux中不工作,python,linux,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)): pri

我有这个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"
它给我的是空输出。我不知道问题出在哪里

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
它在我的机器上工作(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')

或者使用
漫游
(但不实际漫游子曲面)

编辑:更清楚地说,原始脚本的错误在于您的文件结构如下:

/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',…]
。但是,当您执行
os.path.isfile('one')时
从/home/user/bin目录中,检查
/home/user/bin/one
是否为文件,而不是/home/vmware/tobackup/one是否为文件。由于
/home/user/bin/one
不存在,因此不会得到任何输出。

os.listdir(dir\u name)
返回与命名目录相关的文件名。若要在其他命令中使用这些文件名,您需要在目录名前面加上前缀(通过循环体开头的
f=os.path.join(to_backup,f)
),或者在启动循环之前将工作目录更改为备份目录


这些是jimbob博士答案中显示的前两个备选方案。

os.listdir(to_backup)为您提供了什么?您可以通过shell手动验证该目录中是否有文件吗?文件在那里,我尝试了listdir命令,它再次显示emptyCall您的脚本(假设它被称为lister.py)请使用python-v lister.py和post output。上面的脚本起作用了。这是为什么呢?我已经在questionsWell中添加了输出,我显式地运行了命令来列出目录。您需要做的(现在我们已经检查了您是否有权限和文件/dir在那里),就是转到该目录。(例如,
os.chdir(to_backup)
)。假设您正在从目录“~/bin/”运行脚本,并且os.list_dir(to_backup)=[“一”、“二”、“三”、“四”、“五”]。然后检查os.path.isfile(“一”)是否是当前目录中的文件或目录(它不是因为
~/bin/one
不存在)。一个更好的解决方案是使用
os.walk
@Mahakaal:当您的脚本获得
os.listdir
时,您有一个列表
['one','two',…]
。然后
os.path.isfile('one')
从/home/vmware运行它会检查/home/vmware/one是否是一个文件(它不是;它不存在)。您希望它检查
/home/vmware/tobackup/one
是否是一个文件。要执行此操作,您必须将当前目录更改为
/home/vmware/tobackup
(如我使用
os.chdir
的第一个解决方案中所示),或者确保不检查f(这只是'one','two',但是用os.path.join(to_backup,f)检查'/home/vmware/tobackup/one'作为第二个解决方案。谢谢你,伙计,这是非常详细的,你的其他解决方案工作得非常好。我真的很感谢你在这方面的努力。我拥有ls命令正在工作的所有权限,但不是python命令。“pdb”是你的朋友,而不是猜测错误问题:使用pdb调试它
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"
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
...