2014-07-23 36 views
-1

我在Python中的代碼,我有一個問題。 我有file1.py:在其他文件中使用REMOTE_ADDR

import os, sys, platform, getpass, tempfile 
import webbrowser 
import string 
import json 
import cgi, cgitb 



def main(addr, name): 
    os.environ["REMOTE_ADDR"] = addr 
    print os.environ ["REMOTE_ADDR"] 

    template = open('file2.py').read() 

    tmpl = string.Template(template).substitute(
      name = name, 
      addr = cgi.escape(os.environ["REMOTE_ADDR"]), 
      os = user_os, 
      user_name = user_login, 
      ) 

    f = tempfile.NamedTemporaryFile(prefix='/tmp/info.html', mode='w', delete=False) 
    f.write(contenu) 
    f.close() 

    webbrowser.open(f.name) 


if __name__ == "__main__": 
     addr = sys.argv[1] 
     name = sys.argv[2] 

    user_os = sys.platform 
    sys.argv.append(user_os) 

    user_login = getpass.getuser() 
    sys.argv.append(user_login) 

    main(addr, name) 
file2.py

<form name="sD" method="get" action="${addr}"> 

但我有這個錯誤,我試圖解決這個問題,但我不知道如何可以做到這一點:(

Traceback (most recent call last): 
    File "./file1.py", line 47, in <module> 
    main(addr, name) 
    File "./file1.py", line 22, in main 
    addr = cgi.escape(os.environ["REMOTE_ADDR"]) 
    File "/usr/lib/python2.6/UserDict.py", line 22, in __getitem__ 
    raise KeyError(key) 
KeyError: 'REMOTE_ADDR' 

我的問題是,我不知道如何可以在命令行中添加一個addr變量並恢復在URL中的IP地址,當我確定按鈕

幫助單擊我請:(

+0

是什麼 「這個錯誤」 ? – TylerH

+0

@TylerH:對不起,我編輯了代碼並添加了錯誤。 – Kasper

+0

@安迪:請,如果你想幫助我 - >幫助,否則讓別人幫助我,謝謝。 – Kasper

回答

0

從你的shell(即命令行)

$> set REMOTE_ADDR=<some url> 

$> python 
>>> import os 
>>> print os.environ['REMOTE_ADDR'] 
<some url> 

如果您在Python實例定義它,它僅適用於該實例

,但通過把在「環境」調用任何模塊它是「全球」可用之前

+0

我沒有使用python終端,但是如果我有這個時候我嘗試:>>> import os >>> print os.environ ['REMOTE_ADDR'] Traceback(最近呼叫最後一個): 文件「 」,1號線,在 文件 「/usr/lib/python2.6/UserDict.py」 22行,在__getitem__ 引發KeyError異常(鍵) KeyError異常: 'REMOTE_ADDR' – Kasper

+0

是的,它需要設置並需要設置爲一個值。我使用python終端來說明這個概念 - 就像任何模塊繼承父進程的環境一樣。在模塊中設置env值不會將其置於父母的環境中。 – gkusner

+0

但你在啓動python之前聲明你的設置....我很失落....你和Andy談論價值,但我不明白,因爲REMOTE_ADDR是獲取客戶端IP,並且當我使用REMOTE_ADDR它的工作原理相同,但如果我在其他文件中調用它,它不起作用,addr參數(在命令行中)是他在命令行中填充它的客戶端的IP,我只是想在URL中恢復此addr時點擊一個按鈕進入下一個網頁,這是全部:( – Kasper

1

您的代碼有多個問題。

首先,在提到你previous question

you dont (I repeat: you dont) want the IP of the client as the url for your form's action

到底什麼,你覺得這行代碼是要幹什麼?

<form name="sD" method="get" action="${addr}"> 

它會嘗試將表格發送到最終用戶的IP地址。 這會失敗。因爲

  • 他們可能沒有運行
  • 即使他們這樣做Web服務器這將失敗,他們可能沒有用來處理表單
  • 你應該提交的腳本形成一個您控制的頁面,以便您可以處理它

至於您丟失的關鍵錯誤,您沒有設置環境變量。你可以做這幾個方面:

  • 以外的Python腳本的,使用這個命令:set REMOTE_ADDR=<value>。用適當的值替換<value>
  • 從你的Python腳本內,使用此代碼

記得導入os

import os 
os.environ["REMOTE_ADDR"] = "value" 

再次,value應該是一個適當的值。

一個非常簡單的,你想要什麼例子:

import os, sys 

def main(addr, name): 
    os.environ["REMOTE_ADDR"] = addr 
    print os.environ["REMOTE_ADDR"] 

if __name__ == "__main__": 
    addr = sys.argv[1] 
    name = sys.argv[2] 

    main(addr, name) 

此輸出:

>python test.py "address" "name" 
address 

>python test.py "http://www.google.com" "name" 
http://www.google.com 

最後,在你previous question提到:

you dont (I repeat: you dont) want the IP of the client as the url for your form's action

+0

因此,我使用這樣的參數執行我的腳本:/file1.py addr name,addr它是服務器的地址(=一個URL) – Kasper

+0

如果這是一個問題...沒有。你不要像這樣執行你的代碼,至少不要看看我提供的代碼塊並進行修改。你的'addr'需要被分配給環境變量。 'os.environ [「REMOTE_ADDR」] = addr' – Andy

+0

這就是我在替換中所做的:addr = cgi.escape(os.environ [「REMOTE_ADDR」])...我迷路了 – Kasper

相關問題