2013-07-11 20 views
6

Ben bir cron işi scipts nedeniyle cron içinde kabuklar açılışına komut nun içine çalıştırmak için gerekli ortam değişkenleri tutmak gerektiğini detaylandırma çoklu mesajları ve birçok makale okudum çağıran crontab çalışmıyor. Benim durumum değişkendir, çünkü benim yol değişkenlerim tartışıldıkları şekilde ayarlanıyorlar, bu da subprocess.call() kullanarak pysaunter python yumurtasını başarılı bir şekilde çağırıyor, ama oradan kopacak gibi görünüyor. Bu, tüm sürecin bir cron işinde kırılmasına neden olur.Python Senaryo pysaunter

Anlaşılır olması için, burada atıfta adımlar şunlardır:

1) cronjob calls run_test.py -n foo 
2) run_test.py sets the environment variables correctly 
(cur_shell_path=sys.path (converted to proper path string, not shown here) 
my_env= os.environ.copy() 
my_env["PATH"] = my_env["PATH"] + cur_shell_path) 
3) run_test.py calls subprocess.call("pysaunter -m foo -v", env=my_env, shell=True) 
adım 3'ün çıkış o yumurtayı bulma ve başarılı pysaunter gerekli modülleri yüklemek için başlar, ama sonra ne zaman kırılır olduğunu göstermektedir

pysaunter'ı değiştirmek için kullanılan bir dizini bulmaya çalışmak. Ben çevreye birden çok kez bu yolu ekleyerek çalıştılar

ImportError: no module named helpers 

ama asla helpers.py içeren dizini bulmak için görünüyor: hata okur. pysaunter -m foo -v komutu, etkileşimli bir kabuktan çağrıldığında normal olarak çalışır.

ben pysaunter üzerinde çok yardım bulamadık, bu yüzden çok fazla pysaunter özelliklerini burada gereksiz olacağını varsayabiliriz. Eğer pysaunter hakkında daha fazla şey biliyorsanız, daha fazla bilgiye ihtiyaç duyarsanız lütfen bize bildirin. Ne paylaşacağımı bilmiyorum.

Ayrıca, bir kabuğun varsayılan davranışını .profile/.bash_profile dosyasını düzenleyerek değiştirme yeteneğini tartışan birçok yazı okudum. Yol değişkenlerimi küresel olarak erişilebilir kılacak bir yer bulmaya çalıştım, ancak hiçbir şey bulamadım. Bunun nasıl yapıldığından emin değilim ve sorunumu düzeltebilir, bu yüzden bu konuda bir şey biliyorsanız lütfen bana bildirin.

Son Not, bu Mac 10.7.5 çalışıyor. Söylediğin Ne

cevap

3

çok deneme yanılma ve birçok, birçok stackoverflow.com makale ve diğer öğreticiler sonra online ve bir Perl betiğinin yardımıyla benzer bir şey yaptığını buldum, bunun işe yaraması için ne yapılması gerektiğini anlayabildim. İşte

doğru kurulmuş olup her şeyi emin adımları şunlardır:

  1. Eğer PYTHONPATH gereken değişkenleri olduğundan emin olun (here ve here ve daha fazla bilgi için bulunan here gidin.) Içeride Çalıştığınızdan emin olmak için betiğinizi test etmek istediğiniz herhangi bir kabuk için .profile veya .bash_profile.

  2. düzenleme bir cron işi içinde komut dosyasını çalıştırmak için gerekli dizinleri içerecek şekilde crontab (here ve here bulundu).

    a) here açıklandığı gibi) YOL değişkeni (. Kök dizin eklemeyi unutmayın. Eğer komut ile yürütülebilir bir çalışan eğer Temelde, kök veya yürütülebilir belki de depolanır ve dizini bulmak mümkün olması gerekiyor bu: (/ sbin:/bin:/usr/sbin:/usr/bin).

  3. Crontab dosyanızda, geçerli dizini daha önce komut dosyasını başarıyla çalıştırdığınız dizine değiştirecek bir cronjob oluşturun (ör./Users/user/Documents/foo).

    a) Bu aşağıdaki gibi görünecektir:

    * * * * cd /Users/user/Documents/foo; bar -l doSomething -v 
    
  4. benim sorunum bir yürütülebilir çağırarak ile özel olarak ele yana, çalıştırmak için Python komut dosyası yazma birden fazla yol olduğuna dikkat gereklidir (gerçi keşif sürecinde, bunun cron'daki alt işlem kullanılarak yapılan herhangi bir çağrı için çalıştığını öğrendim. Böyle

    ... #some script calls 
    my_env = os.environ.copy() 
    my_env["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>") 
    os.chdir("<path/to/desired/directory>") 
    subprocess.Popen(<call_as_string>, env=my_env, shell=True) 
    

    Ve ikinci görünüyor: denirdi nerede çalıştırılabilir yardımcıları dizinin yolunu gerekli beri

    ... #some script calls 
    os.environ["PYTHONPATH"] = "{}:{}".format(os.environ["PATH"] ,"<path you want to include>") 
    os.chdir("<path/to/desired/directory>") 
    subprocess.Popen(<call_as_list_of_arguments) 
    

    kabuğunda bulunan

    İlk yöntem şöyle gelen here açıklandığı gibi yürütülebilir çevre değişken geçirmek gerekmiştir. Ne buldum, ama, bir cron işi için işe yaramadı ortamda YOL değişkeni değiştirerek, ama PYTHONPATH ayarı yaptım olmasıdır. Ben YOL değişkeni sen Kabuğu yeni Python modülleri için bakmak için bir PYTHONPATH geçmesi gerekiyor cronjob içinde yeni bir kabuk için yani sadece, yürütülebilir aramaya kabuk tarafından kullanıldığını here okuyun. (Bu ayrıca explained in the Python docs.)

    İki farklı yöntem arasındaki farklılıklar, söz konusu alt işlem belgelerinde açıklanmıştır, ancak bu modülde iyi bir eğitici bulunabilir here.

1

hiçbir mantıklı.

Sen shell_env = sys.path söylüyorlar. sys.path, modülleri aramak için bir ortam değişken eşlemesi değil, python için bir klasör listesidir!

Bunu, subprocess.call içinde kullanabilirsiniz. Belki de env=my_env yazmayı kastediyordunuz. Bir sonraki problem

. İlk olarak, PATH, ':' ile ayrılmış bir klasör listesi olmalıdır. Sadece shell_path'i son klasöre yapıştırıyorsun.

Son olarak, piton piton modüllerini bulmak için bir liste olarak PYTHONPATH kullanır (hangi sorunları yaşadığınızı gibi görünüyor hangi.)

+1

Sorunumu belirttiğiniz için teşekkür ederiz, şimdi my_env öğesinin geçildiğini göstermek için düzeltdim. Ayrıca, Unix tabanlı makinelerde, kolon (:) yol değerlerini ayırmak için kullanılır, böylece bir sorun olmaz. Son olarak, PYTHONPATH kabuk [başlatılan] nerede ile tanımlanır Unix yerel dizini, arama için kullanılan (http://docs.python.org/release/1.5.1p1/tut/searchPath.html). Cron işleri, doğru dizinden başlatılmayan ve .profile veya .bash_profile öğelerini okumayan etkileşimli bir kabuk çağırdığından, yol eklenmez ve bu nedenle Pythonpath ayarlanmaz. – derigible

+1

Kolon hakkında haklıydın. Onu tamir ettim. PYTHONPATH'ı cron işine ayarlamanız gerekir. İstediğiniz dizine PYTHONPATH ayarlayan bir sarıcı komut dosyası oluşturabilir ve sonra python komut dosyasını çağırırsınız. – korylprince