Tôi đã đọc nhiều bài viết và nhiều bài viết chi tiết rằng scipts trong một công việc cron cần phải giữ các biến môi trường cần thiết để chạy bên trong bản thân script do việc mở các shell trong cron. Tình trạng của tôi là duy nhất trong đó các biến đường dẫn của tôi tất cả được thiết lập như được thảo luận, do đó sẽ thành công gọi trứng python pysaunter bằng cách sử dụng subprocess.call(), nhưng dường như nó bị phá vỡ từ đó. Điều này làm cho toàn bộ quá trình phá vỡ trong một công việc cron.Python Script không chạy trong crontab gọi pysaunter
Để rõ ràng, đây là các bước tôi tham khảo:
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)
Kết quả của bước 3 cho thấy rằng nó là tìm trứng và bắt đầu thành công để tải các module cần thiết từ pysaunter, nhưng sau đó nó phá vỡ khi cố gắng tìm một thư mục được sử dụng để sửa đổi pysaunter. Lỗi đọc:
ImportError: no module named helpers
Tôi đã cố thêm đường dẫn này vào môi trường nhiều lần nhưng dường như không tìm thấy thư mục chứa helpers.py. Lệnh pysaunter -m foo -v
hoạt động bình thường khi được gọi từ một trình bao tương tác.
Tôi không thể tìm thấy nhiều trợ giúp trên pysaunter, vì vậy tôi giả định rằng quá nhiều chi tiết cụ thể pysaunter sẽ không cần thiết ở đây. Tuy nhiên, nếu bạn biết nhiều hơn về pysaunter, vui lòng cho tôi biết nếu bạn cần thêm thông tin. Tôi không chắc chắn những gì để chia sẻ.
Tôi cũng đã đọc nhiều bài đăng thảo luận về khả năng thay đổi hành vi mặc định của trình bao bằng cách chỉnh sửa .profile/.bash_profile. Tôi đã cố gắng tìm một nơi có thể làm cho các biến đường dẫn của tôi có thể truy cập trên toàn cầu, nhưng tôi không thể tìm thấy bất cứ thứ gì. Tôi không chắc làm thế nào điều này được thực hiện, và nó có thể sửa chữa vấn đề của tôi, vì vậy nếu bạn biết bất cứ điều gì về điều đó xin vui lòng cho tôi biết.
Lưu ý cuối cùng, điều này đang chạy trên máy Mac 10.7.5.
Cảm ơn bạn đã chỉ ra vấn đề của mình, tôi hiện đã khắc phục sự cố để hiển thị rằng my_env đang được chuyển. Ngoài ra, trên các máy dựa trên Unix, dấu hai chấm (:) được sử dụng để tách các giá trị đường dẫn, do đó không thể là vấn đề. Cuối cùng, Pythonpath được sử dụng để tìm kiếm thư mục cục bộ, mà trên Unix được định nghĩa bởi nơi mà shell được [khởi chạy] (http://docs.python.org/release/1.5.1p1/tut/searchPath.html). Vì các công việc cron gọi một shell không tương tác không được khởi chạy từ thư mục chính xác và không đọc một .profile hoặc .bash_profile, không có đường dẫn nào được thêm vào và do đó Pythonpath không được thiết lập. – derigible
Bạn đã đúng về dấu hai chấm. Tôi đã sửa nó. Bạn cần đặt PYTHONPATH trong công việc cron. Bạn có thể tạo một kịch bản trình bao bọc để đặt PYTHONPATH thành thư mục mong muốn và sau đó gọi tập lệnh python. – korylprince