Python:绝对路径问题

时间:2016-06-30 18:32:15

标签: python subprocess absolute-path

我有几个文件存储在名为controlFiles的文件夹中。此文件夹的路径是Users / Desktop / myproject / controlFiles。

我正在尝试使用以下代码在我的python脚本中运行子进程命令:

def codeml(codeml_location, control_location):
    runPath = codeml_location + '/codeml'
    for file in os.listdir(control_location):
        ctlPath = os.path.abspath(file)
        subprocess.call([runPath, ctlPath])

脚本的功能是运行一个名为codeml的命令行工具,第一个参数是codeml可执行文件的位置,第二个参数是codeml使用的控制文件的文件夹。当我运行此脚本运行codeml但我收到错误:

error when opening file /Users/Desktop/myproject/subtree.39.tre.ctl
tell me the full path-name of the file? 

我的困惑来自于controlFiles文件夹不在该路径中,但它仍然标识文件夹中的文件。

要检查我输入了正确的control_location参数,我编辑了代码:

def codeml(codeml_location, control_location):
    runPath = codeml_location + '/codeml'
    for file in os.listdir(control_location):
        print os.path.abspath(file)

运行此命令会打印controlFiles文件夹中的所有文件,但同样没有路径中的文件夹。以下是打印输出的示例:

/Users/Desktop/myproject/subtree.68.tre.ctl
/Users/Desktop/myproject/subtree.69.tre.ctl
/Users/Desktop/myproject/subtree.70.tre.ctl
/Users/Desktop/myproject/subtree.71.tre.ctl

要运行该功能,我的控制位置参数为:

control_location = /Users/Desktop/myproject/controlFiles

最后一点是终端中的工作目录是/ Users / Desktop / myproject,这是因为这是我的Click项目的位置。为什么要拾取文件而不是包含它们的文件夹?

4 个答案:

答案 0 :(得分:3)

os.listdir会列出目录control_location中不在当前工作路径中的文件名。因此,您必须使用路径control_location加入文件名:

for file in os.listdir(control_location):
    ctlPath = os.path.abspath(os.path.join(control_location, file))

答案 1 :(得分:1)

在子流程中设置cwd:

 for file in os.listdir(control_location):
    subprocess.call([runPath, file],  cwd=control_location)

listdir 只是返回基本名称,而不是完整路径。将cwd设置为文件所在的位置将允许您只传递文件。如果 listdir 可以提交 control_location ,那么子进程也应该没有问题。

答案 2 :(得分:0)

我设法使用以下方法解决了这个问题:

for file in os.listdir(control_location):
        filepath = os.path.dirname(os.path.realpath(file)) 
        subprocess.call([runPath, filepath])

答案 3 :(得分:0)

  

脚本的功能是运行一个名为codeml的命令行工具,第一个参数是codeml可执行文件的位置,第二个参数是codeml使用的控制文件的文件夹。

如果codemlimport os import subprocess def codeml(codeml_location, control_location): executable = os.path.join(codeml_location, 'codeml') subprocess.check_call([executable, control_location]) 使用的控制文件的文件夹:

os.listdir()

您无需在此处致电request