2016-06-30 4 views
2

У меня есть несколько файлов, хранящихся в папке controlFiles. Путь к этой папке - «Пользователи/Рабочий стол/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. Почему файлы берутся, но не содержит их папку?

ответ

3

os.listdir перечисляет имена файлов в каталоге control_location не в текущем рабочем пути. Таким образом, вы должны присоединиться к имени файла с путем control_location:

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

Hi Daniel. Это работает для перечисления всех имен файлов при использовании print ctlPath, но причудливо я все еще получаю ту же проблему при использовании ctlPath в моей команде подпроцесса. Я также попытался поместить os.path.abspath (os.path.join (control_location, file)) непосредственно в команду подпроцессора, а не создавать переменную, но все равно та же проблема. – spiral01

+0

затем покажите свой код команды подпроцесса. – Daniel

+0

Как и выше, команда подпроцесса: subprocess.call ([runPath, ctlPath]) – spiral01

1

Установите УХО в подпроцессе:

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

listdir только возвращение, не базовое имени полного пути. Установка cdd в том месте, где находятся файлы, позволит вам просто передать файл. Если listdir может подать control_location, то подпроцесс также не должен иметь проблем.

+0

Привет Падре. Использование subprocess.call ([runPath, ctlPath], cwd = control_location) все равно дает мне ту же ошибку. То есть, определяя ctlPath как: os.path.abspath (os.path.join (control_location, file), как было предложено Даниэлем – spiral01

+0

@ spiral01, попробуйте отредактировать, это должен быть файл не ctlPath, просто забудьте о ctlPath полностью –

0

мне удалось решить эту проблему с помощью:

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

' filepath' ничем не отличается от 'os.getcwd()'. И поэтому for-loop бесполезен. – Daniel

0

The script's function is to run a command line tool called codeml, with the first argument being the location of the codeml executable, and the second being a folder of control files that codeml uses.

если control_location папка файлов управления, которые 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() здесь.

Смежные вопросы