2012-10-03 26 views
3

要在Linux和bash Python腳本可執行文件,一個使用家當Python的家當和換行符

#! /usr/bin/env python 

爲腳本的第一行。如果這一行碰巧以Windows風格的換行符\ r \ n(回車換行符)結束,而不是Unix風格的換行符\ n,那麼bash將無法通過Python解釋器運行腳本。

我在做Python的跨平臺開發。當我在Windows上工作時,自然換行符是\ r \ n。當我在Linux上工作時,自然的換行符是\ n。鑑於我使用Mercurial進行版本控制,在包含shebang的腳本文件中強制使用\ n換行符的最佳方式是什麼?

+0

嘗試將shell的註釋字符添加到行尾。 –

+2

你可以配置你的Windows編輯器來使用unix風格的行結尾嗎? – Andbdrew

+0

我試過#!/usr/bin/env python#,沒有運氣。我不想配置編輯器,因爲我希望通過自動處理來保證shebang的工作能夠抵抗微不足道的人爲錯誤。 – kaba

回答

4

常用的方法不是自己生成外部包裝腳本,而是在您的setup.py中指定它們,並讓它們在程序包安裝期間生成。

如果你這樣做了以下內容:

setup(
    entry_points = { 
     "console_scripts": [ 
      "script_name": "your.module.name:main", 
     ], 
    } 
) 

......然後,在安裝時,會生成並安裝一個名爲script_name包裝,並適當配置,以你目前的平臺(認領線運行和所有)。這使得使用中的行尾字符沒有意義。

+0

這似乎是現場。在任何情況下,我都需要照顧包裝,所以如果它也可以照顧she,,那麼問題似乎就解決了。 – kaba

+0

@Kaba解決了Python的問題,但不能解決其他腳本或源文件。 SCM方法在一般情況下解決它。所以你也可以設置它。 – Keith

+0

@Keith這種方法也解決了EOL方法沒有的問題。在你的機器上有單獨的'python2.4'和'python2.6'解釋器? 'setup.py'方法創建封裝器,以使用安裝了庫的同一個封裝器,而不是依靠'/ usr/bin/env'來選擇路徑中的第一件東西。我同意使用兩者都有價值,但對於Python的情況,僅依靠EOL轉換是一個不足的解決方案。 –

0

你可能想檢查EolExtension了。

使用EolExtension,您可以爲您的存儲庫強制結束某一行。提交不同行尾的文件會自動轉換。

1

此問題對於在非本機平臺上開發的所有腳本而言都是通用的,而不僅僅是Python。大多數SCM具有自動行結束轉換功能。 Mercurial可以做到這一點,但這不是默認設置。請參閱EOL Extension

+0

EOL擴展似乎是一個非常好的主意。爲什麼它被標記爲最後的手段功能?http://mercurial.selenic.com/wiki/FeaturesOfLastResort – kaba

+0

@Kaba我不知道,我想知道我自己。 Subversion也有這個功能,它沒有這樣的警告。在subversion中,你可以用屬性標記每個文件,其中一個名爲'svn:eol-style',你可以設置爲'native',它也會自動轉換。這個標籤可以自動添加到某些文件。 – Keith