我有几个文件存储在名为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项目的位置。为什么要拾取文件而不是包含它们的文件夹?
答案 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使用的控制文件的文件夹。
如果codeml
是import 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
。