2009-12-21 2 views
1

Я новичок в python, и я пытаюсь создать программу, которая создает каталог с текущей датой, создает в этом каталоге песочницу и запускает make-файл в песочнице. У меня возникают проблемы с получением переменных в линиях os.path. Код размещен ниже:Переменные в python os.path

#!/usr/bin/python 
import mks_function 
from mks_function import mks_create_sandbox 
import sys, os, time, datetime 
import os.path 

today = datetime.date.today() # get today's date as a datetime type 

todaystr = today.isoformat() # get string representation: YYYY-MM-DD 
          # from a datetime type. 

if not os.path.exists('/home/build/test/sandboxes/'+todaystr): 
os.mkdir(todaystr) 
else: 
pass 

if not os.path.exists('/home/build/test/sandboxes/'+todaystr+'/new_sandbox/project.pj'): 
mks_create_sandbox() 
else: 
pass 

if os.path.exists('/home/build/test/sandboxes/'+todaystr+'/new_sandbox/Makefile'): 
os.system("make >make_results.txt 2>&1") 

Любая помощь будет оценена, Благодаря

+0

когда вы создали '/ new_sandbox /' dir? Я думаю, что здесь ваш код не работает. – ariefbayu

+0

для громкого крика, не используйте MKS. переключитесь на Subversion или что-то – zaharpopov

ответ

3

пару нот:

#!/usr/bin/env python 
# import mks_function .. you won't need this ... 

from mks_function import mks_create_sandbox 
import os, datetime 

# import time, sys .. these aren't used in this snippet 
# import os.path .. just refer to os.path, since os is already imported 

# get today's date as a datetime type 
todaystr = datetime.date.today().isoformat() 

# .. use os.path.join() 
if not os.path.exists(os.path.join('/home/build/test/sandboxes/', todaystr)): 
    os.mkdir(os.path.join('/home/build/test/sandboxes/', todaystr)) 
# .. 'else: pass' is unnecessary 

if not os.path.exists(os.path.join(
    '/home/build/test/sandboxes/', todaystr, '/new_sandbox/project.pj')): 

    # i'm not seen, that the sandbox is created in the right directory here 
    # maybe you should change the working directory via .. 
    # os.chdir(os.path.join('/home/build/test/sandboxes/', todaystr)) 
    mks_create_sandbox() 

if os.path.exists(os.path.join(
    '/home/build/test/sandboxes/', todaystr, '/new_sandbox/Makefile')): 

    # .. change to the right directory 
    os.chdir(os.path.join(
     '/home/build/test/sandboxes/', todaystr, '/new_sandbox/')) 

    os.system("make > make_results.txt 2>&1") 
1

Я думаю, что вы хотите изменить несколько вещей:

def makeSandbox(): 
    sbdir = os.path.join('/home/build/test/sandboxes/',todaystr) 
    if not os.path.exists(sbdir): 
    os.mkdir(sbdir) # <- fully qualified path 
    else: 
    pass 

И я не вижу, что переменные должны быть подобраны, кажется мне прекрасным.

+0

Я считаю, что проблема кроется в этой строке: если не os.path.exists ('/ home/build/test/sandboxes /' + todaystr + '/ new_sandbox/project.pj'): он создает dir '/ home/build/test/sandboxes /' + todaystr, но когда он попытался создать файл внутри него, он забыл создать/new_sandbox/dir. – ariefbayu

0

Не знаете, что делает модуль mks_function. Но я вижу одну проблему с вашим кодом.

Например,

if not os.path.exists('/home/build/test/sandboxes/'+todaystr): 
    os.mkdir(todaystr) 

В приведенном выше фрагменте вы проверить, если каталог «/ Главная/строительство/тест/Песочницы/+„todaystr“» существует и создать каталог по имени " значение, содержащееся в todaystr "(скажем, 2009-12-21). Это создает каталог по имени «2009-12-21» в текущем рабочем каталоге, а не под: /home/build/test/sandboxes , что и предполагалось. Поэтому перейдите в вышеуказанный каталог перед вызовом mkdir. Также полезно проверить статус возврата mkdir, чтобы проверить, удалось ли создать каталог.

+1

проверить статус возврата? Это Python, это вызовет исключение, если создание завершится неудачно. Кроме того, лучше указать каталог с полным путем, чем изменить каталог, что часто приводит к более хрупким программам. – u0b34a0f6ae

+0

Исходя из perl, я понял, что было хорошей практикой проверять результирующие системные вызовы. Спасибо за ваш комментарий, теперь я понимаю, что правильная вещь в Python - это забота о (дескрипторе) исключениях. – sateesh

0

Пожалуйста, попробуйте добавить код Chdir перед вызовом сделать

if os.path.exists('/home/build/test/sandboxes/'+todaystr+'/new_sandbox/Makefile'): 
os.chdir('/home/build/test/sandboxes/'+todaystr+'/new_sandbox/') 
os.system("make >make_results.txt 2>&1") 
0

path модуль может помочь в этом случае:

#!/usr/bin/env python 
from mks_function import mks_create_sandbox 
import os, datetime 

from path import path 

sandboxes = path('/home/build/test/sandboxes/') 
today = sandboxes/datetime.date.today().isoformat() 
today.mkdir() # create directory if it doesn't exist 

project = today/"new_sandbox/project.pj" 
project.parent.mkdir() # create sandbox directory if it doesn't exist 
if not project.isfile(): 
    mks_create_sandbox() 

makefile = project.parent/"Makefile" 
if makefile.isfile(): 
    os.chdir(makefile.parent) 
    os.system("make >make_results.txt 2>&1") 
+0

ooh. оператор '/', используемый для объединения путей, является довольно экспериментальным. – u0b34a0f6ae

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