2013-02-14 17 views
2

上下文:我在我的Mac上運行this snippet,並注意到字符串-n撒在亂碼輸出中。答案是,Ubuntu上的sh理解-n標誌,而我的Mac上的sh不理解。python on OSX和回聲-n

enter image description here

正如你可以看到,蟒蛇被髮送到標準輸出字符串"-n abc\n"而不是預期的​​。

os.system呼叫無法分開-nabc?與zsh(倒立的%是zsh指示EOF的方式)和bash一起發生,儘管如果我沒有弄錯,python調用不應該調用shell(不是因爲我讀了任何這樣說,但基於我的共同點義)(編輯:原來我是完全錯誤和系統運行的子shell)

見紅寶石怎麼做:

enter image description here

和一些更多的測試:

enter image description here 看起來像腳本發送到sh,但當時shell的環境變量仍爲zsh。說得通。我沒有做任何清理環境......也許sh不會自動設置$SHELL

+0

了我的系統上正常工作,我的'Python版本2.6.6' – 2013-02-14 04:34:14

回答

2

The Python docs狀態:

[os.system]是通過調用標準C函數系統()

按照通過到the man page for C's system實施:

系統()執行一個通過調用/ bin/sh -c命令在命令中指定的命令,並在命令已完成。在執行該命令期間,SIGCHLD將被阻塞,並且SIGINT和SIGQUIT將被忽略。

強調是我的。

The man page for echo解釋它:

某些殼可以提供一個內置echo命令其類似於或等同於本 效用。最值得注意的是,sh(1)中的內建回聲不接受-n選項。 請參閱內置(1)手冊頁。

你也可以證實這一點你自己:

$ sh -c "echo -n hello" 
-n hello 
$ bash -c "echo -n hello" 
hello 
0

正如the documentation指出,os.system在子shell執行命令。根據您的系統,它可能使用一個外殼whos echo命令不明白-n

如果要確保它使用您選擇的外殼,請使用subprocess.call,並使用shell=Trueexecutable='<shell>'選項而不是os.system

0

這是怎麼回事?
python -c 'import subprocess; subprocess.call(["echo", "-n", "abc"])'
測試的OSX和正常工作