2010-06-11 12 views
11

Tôi đã tự hỏi làm thế nào để làm cho một kịch bản python di động cho cả hai linux và cửa sổ?làm thế nào để làm cho một kịch bản python hoặc perl di động cho cả hai linux và windows?

Một vấn đề tôi thấy là shebang. Làm thế nào để viết shebang để kịch bản có thể chạy trên cả hai cửa sổ và linux?

Có vấn đề gì khác ngoài shebang mà tôi nên biết không?

Giải pháp tương tự cho tập lệnh perl?

Cảm ơn và kính trọng!

Trả lời

14

Windows sẽ chỉ bỏ qua shebang (nghĩa là, sau tất cả, một nhận xét); trong Windows, bạn cần liên kết phần mở rộng .py với tệp thực thi Python trong sổ đăng ký, nhưng bạn hoàn toàn có thể rời khỏi shebang, nó sẽ hoàn toàn vô hại ở đó.

Có nhiều bit và phần cụ thể theo nền tảng (nhiều chỉ tồn tại trên Unix, msvcrt chỉ trên Windows) vì vậy nếu bạn muốn di động, bạn nên tránh những thứ đó; một số khác biệt tinh tế (chẳng hạn như hành vi chính xác chi tiết của subprocess.Popen hoặc mmap) - đó là tất cả những thứ khá tiên tiến và tài liệu sẽ hướng dẫn bạn ở đó. Nếu bạn đang thực hiện (thông qua subprocess hoặc cách khác) các lệnh bên ngoài, bạn nên đảm bảo chúng tồn tại trên cả hai nền tảng, hoặc kiểm tra nền tảng bạn đang sử dụng và sử dụng các lệnh bên ngoài khác nhau trong mỗi trường hợp.

Hãy nhớ luôn luôn sử dụng /, không\, như con đường phân cách (dấu gạch chéo công trình trong cả hai nền tảng, ngược slash là cửa sổ-only), và được tỉ mỉ như để xem mỗi tập tin bạn đang mở là nhị phân hoặc văn bản .

Tôi nghĩ đó là về nó ...

+1

Tốt hơn, hãy sử dụng hằng số 'os.path.sep' làm dấu tách đường dẫn. – dan04

+0

Cảm ơn, Alex! Nếu shebang bị bỏ qua trong cửa sổ, thì tại sao lại có câu hỏi này "Làm thế nào để bỏ qua Pereb shebang trên Windows với Apache 2?". Xem http://stackoverflow.com/questions/2036577/how-do-i-ignore-the-perl-shebang-on-windows-with-apache-2. – Tim

+1

@Tim, trong khi Windows tự bỏ qua các shebang, các chương trình đang chạy trong Windows có thể nhìn thấy dòng đó - và cũng giống như điều đó xảy ra với trình soạn thảo văn bản do đó nó thực hiện cho một máy chủ web. Apache trên Windows thực hiện giải thích shebang riêng của nó - nhưng đối phó với đó là một vấn đề quản trị hệ thống về cấu hình apache, không có gì để làm với Python hoặc thực sự stackoverflow ở tất cả (đó là một câu hỏi serverfault). –

2

Dòng shebang sẽ được diễn giải là nhận xét của Perl hoặc Python. Điều duy nhất gán cho nó một ý nghĩa đặc biệt là vỏ UNIX/Linux; nó bị bỏ qua trên Windows. Cách Windows biết trình thông dịch nào để sử dụng để chạy tệp là thông qua các liên kết tệp trong sổ đăng ký, một cơ chế khác hoàn toàn.

+0

Lưu ý khá đúng. perl sẽ tìm kiếm các cờ trong dòng shebang. Hãy thử chạy một tệp có chứa '#! perl -p' – justintime

+0

Thật vậy nếu bạn tạo một tệp .pl bắt đầu '#! python' sau đó perl sẽ gọi python. – justintime

+0

ah đúng, tôi quên mất điều đó. (Tôi quá quen với Python, mà AFAIK hoàn toàn bỏ qua dòng shebang) –

7

Hãy chắc chắn rằng bạn không xử lý tập tin và thư mục như chuỗi và chỉ đơn giản là nối chúng với một dấu gạch chéo ở giữa. Perl:

$path = File::Spec->catfile("dir1", "dir2", "file") 

Hãy nhớ rằng Windows có thể tích:

($volume, $path, $file) = File::Spec->splitpath($full_path); 
@directories = File::Spec->splitdir($path); 

Khi chạy các chương trình khác, cố gắng tránh liên quan đến vỏ. Trong Perl, khi bạn chạy một lệnh với system chức năng, bạn có thể dễ dàng có được nó sai với:

$full_command = 'C:\Documents and Settings/program.exe "arg1" arg2'; # spaces alert! 
system($full_command); 

Thay vào đó, bạn có thể chạy hệ thống với một danh sách như là đối số: thực thi và các đối số là chuỗi riêng biệt. Trong trường hợp đó, trình bao không tham gia và bạn không gặp rắc rối liên quan đến việc thoát vỏ hoặc dấu cách trong tên tệp.

system('C:\Documents and Settings/program.exe', 'arg1', 'arg2'); 

Có một loạt các vị trí di động được ghi trong sách hướng dẫn perlport.

2

Tôi không biết đủ để nhận xét về cách tiếp cận Python cho vấn đề này, vì vậy tôi sẽ không làm như vậy.

Hầu hết mọi thứ trong Perl sẽ chỉ hoạt động. Có một vài gotchas dễ tránh.

Dưới đây là một vài điều tôi đã đi qua trong những năm qua tôi đã làm việc với Win32 Perl:

  • Dùng 3 hình thức lập luận của open. Hai hình thức đối số có thể có vấn đề với không gian trong đường dẫn. (Dù sao thì bạn cũng nên làm điều này.)
  • Hãy chắc chắn rằng trường hợp này là chính xác khi bạn sử dụng một mô-đun. use Warnings; sẽ xuất hiện để hoạt động, nhưng trong thực tế nó sẽ thất bại.
  • select chỉ hoạt động trên các ổ cắm thực tế trong Windows. Bạn không thể sử dụng nó trên bất kỳ loại xử lý nào khác.
  • Sử dụng File::Spec để quản lý đường dẫn đến tệp.
  • Khi bạn mở một tập tin xử lý CRLF sẽ tự động được chuyển đổi thành LF kết thúc dòng khi xử lý được đọc. LF được đổi thành CRLF khi viết. Nếu bạn muốn tránh điều này, hãy sử dụng binmode trên tay cầm để ngăn chặn bản dịch.
  • Nếu bạn cần chuyển đối số qua một trình bao, hãy đặt dấu ngoặc kép xung quanh mỗi đối số. Điều này sẽ ngăn ngừa lỗi do không gian trong tên tệp.

Xem perlport để biết thêm thông tin về các chức năng riêng lẻ.