2012-04-30 24 views
9

我想打開Web瀏覽器:我如何啓動一個進程,是不是在進入一個文件(例如,打開一個網頁)

c, err := exec.Command("http://localhost:4001").Output() 
if err != nil { 
    fmt.Printf("ERROR: %v, %v\n",err,c) 
} else { 
    fmt.Printf("OK:%v\n",c) 
} 

,我得到的錯誤

ERROR: exec: "http://localhost:4001": file does not exist 

編輯:我想達到什麼是相同的Windows和C#當你這樣做:

Process.Start("http://localhost:4001") 

有了它一個默認瀏覽器的新實例將啓動,顯示URL

+0

有沒有人想出瞭如何在Mac,Android等中做到這一點? – RoboTamer

+0

請參閱[這裏](https://code.google.com/p/go-tour/source/browse/gotour/local.go#197) –

回答

16

"http://localhost:4001/"是一個URL,它無法執行,但您可以執行一個Web瀏覽器(例如firefox)並將URL作爲第一個參數傳遞。

存在Windows,OS X和Linux幫助程序,可用於啓動默認Web瀏覽器。我想對於FreeBSD和Android也有類似的情況,但我不確定。下面的代碼片段應該在Windows,OS X和大多數Linux發行版的工作:

var err error 
switch runtime.GOOS { 
case "linux": 
    err = exec.Command("xdg-open", "http://localhost:4001/").Start() 
case "windows", "darwin": 
    err = exec.Command("open", "http://localhost:4001/").Start() 
default: 
    err = fmt.Errorf("unsupported platform") 
} 
+1

嗨,我測試了它,但它在Windos 7 64bit上沒有做任何事情。 –

+0

我只是運行exec.Command(「打開」,「http:// localhost:4001 /」).Start(),因爲err:= nil給出了「使用無類型無」 –

+1

哦,你說得對。我應該在之前測試過代碼。另外,我在這裏沒有Windows系統,但是一個簡短的在線搜索表明'exec.Command(「rundll32」,「url.dll,FileProtocolHandler」,「http:// localhost:4001 /」)'可能是一個替代。無論如何,我認爲你有這個想法。 – tux21b

1

"http://localhost:4001"不是一個過程,也不是可執行的......它只是一個URL。

它看起來像你試圖獲取一個URL。如果是這樣,請考慮使用net/http

+0

謝謝阿倫,我編輯了我的問題,使其更清晰。我想要的是操作系統啓動顯示URL的默認瀏覽器。 –

3

在tux21b的答案使用

exec.Command("open", "http://localhost:4001/").Start() 

上面並沒有爲我工作在Windows上。然而,這確實:

exec.Command(`C:\Windows\System32\rundll32.exe`, "url.dll,FileProtocolHandler", "http://localhost:4001/").Start() 
5

在Windows下使用:

exec.Command("cmd", "/c", "start", "http://localhost:4001/").Start() 
2

https://github.com/golang/go/blob/33ed35647520f2162c2fed1b0e5f19cec2c65de3/src/cmd/internal/browser/browser.go

// Commands returns a list of possible commands to use to open a url. 
func Commands() [][]string { 
    var cmds [][]string 
    if exe := os.Getenv("BROWSER"); exe != "" { 
     cmds = append(cmds, []string{exe}) 
    } 
    switch runtime.GOOS { 
    case "darwin": 
     cmds = append(cmds, []string{"/usr/bin/open"}) 
    case "windows": 
     cmds = append(cmds, []string{"cmd", "/c", "start"}) 
    default: 
     cmds = append(cmds, []string{"xdg-open"}) 
    } 
    cmds = append(cmds, []string{"chrome"}, []string{"google-chrome"}, []string{"firefox"}) 
    return cmds 
} 

// Open tries to open url in a browser and reports whether it succeeded. 
func Open(url string) bool { 
    for _, args := range Commands() { 
     cmd := exec.Command(args[0], append(args[1:], url)...) 
     if cmd.Start() == nil { 
      return true 
     } 
    } 
    return false 
} 
+1

根據您的示例,我試圖在Windows 10中打開一個具有特定broser的頁面,但調用「chrome URL」不起作用,我打電話給「start chrome URL」 –

0

起初,我喜歡通過@ tux21b提供了答案。但是這個代碼存在一個微妙的問題:用於選擇平臺特定代碼的條件邏輯將被嵌入到目標可執行二進制文件中。這意味着,邏輯將出現在「windows」,「linux」,「達爾文」或任何目標平臺上。在這個特定的例子中,代碼只是每個平臺一行。但想象一下,如果代碼每個平臺的代碼數超過100行,會發生什麼?目標可執行文件將大幅增長。因此,不是爲每個可能的平臺都包含代碼,最好在構建時包含正確的代碼。其實Go支持構建標籤的功能,該功能可以更加精細地控制平臺特定的代碼。

例如,如果一個文件包含此評論(包聲明前):

// +build linux darwin

去構建將其編譯爲Linux或Mac OS X.建設,只有當它的意思是目標可執行文件將包含外星平臺的無代碼。

open-golang包提供了質疑的功能,但用建立標籤記住!

相關問題