Переменные в питоне os.path - PullRequest
1 голос
/ 21 декабря 2009

Я новичок в python и пытаюсь создать программу, которая создает каталог с текущей датой, создает песочницу в этом каталоге и запускает файл make в песочнице. У меня проблемы с получением переменных, которые будут подобраны в строках 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")  

Любая помощь будет оценена, Спасибо

Ответы [ 5 ]

3 голосов
/ 21 декабря 2009

пара заметок:

#!/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 голос
/ 21 декабря 2009

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

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 голосов
/ 21 декабря 2009
Модуль

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 голосов
/ 21 декабря 2009

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

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 голосов
/ 21 декабря 2009

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

Например,

</p> <pre><code>if not os.path.exists('/home/build/test/sandboxes/'+todaystr): os.mkdir(todaystr)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...