我应该把shebang放在我的Python脚本中吗?以什么形式?
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
要么
#!/usr/local/bin/python
Run Code Online (Sandbox Code Playgroud)
这些同样便携吗?哪种形式最常用?
我需要通过我的应用服务器提供我的应用程序8080
,以及来自目录的静态文件,而无需触及应用服务器.我拥有的nginx配置是这样的......
# app server on port 8080
# nginx listens on port 8123
server {
listen 8123;
access_log off;
location /static/ {
# root /var/www/app/static/;
alias /var/www/app/static/;
autoindex off;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用此配置,一切正常.请注意,该root
指令已被注释掉.
如果我激活root
和停用alias
- 它会停止工作.但是,当我/static/
从root
它删除尾随它开始再次工作.
有人可以解释发生了什么.还请解释清楚和冗长之间有什么区别root
和alias
和它们的用途.
考虑一下这些表达方式......请耐心等待...这是一个很长的清单......
(注意:重复一些表达式 - 这只是为了呈现"上下文")
a, b = 1, 2 # simple sequence assignment
a, b = ['green', 'blue'] # list asqignment
a, b = 'XY' # string assignment
a, b = range(1,5,2) # any iterable will do
# nested sequence assignment
(a,b), c = "XY", "Z" # a = 'X', b = 'Y', c = 'Z'
(a,b), c = "XYZ" # ERROR -- too many values to unpack
(a,b), c = "XY" # ERROR -- need more than 1 value …
Run Code Online (Sandbox Code Playgroud) 我正在做这样的事......
conn = sqlite3.connect(db_filename)
with conn:
cur = conn.cursor()
cur.execute( ... )
Run Code Online (Sandbox Code Playgroud)
with
自动提交更改.但是文档没有提到关闭连接.
实际上我可以conn
在以后的陈述中使用(我已经测试过).因此,似乎上下文管理器没有关闭连接.
我是否必须手动关闭连接.如果我把它打开怎么办?
编辑
我的结论......
__exit__
,上下文管理器ONLY通过执行来提交更改conn.commit()
with conn
并且with sqlite3.connect(db_filename) as conn
是同一件事.所以使用其中任何一个仍将使连接保持活跃with
语句不会创建新范围,因此在with的套件内创建的所有变量都可以在其外部访问我试图从不同的部分形成URL,并且无法理解此方法的行为.例如:
Python 3.x
from urllib.parse import urljoin
>>> urljoin('some', 'thing')
'thing'
>>> urljoin('http://some', 'thing')
'http://some/thing'
>>> urljoin('http://some/more', 'thing')
'http://some/thing'
>>> urljoin('http://some/more/', 'thing') # just a tad / after 'more'
'http://some/more/thing'
urljoin('http://some/more/', '/thing')
'http://some/thing'
Run Code Online (Sandbox Code Playgroud)
你能解释一下这种方法的确切行为吗?
我有一个像这样的项目结构......
/some_app
build/
README
out.py
some_app/
__init__.py
mod1.py
mod2.py
Run Code Online (Sandbox Code Playgroud)
现在我想导入some_app
包mod2
,而不是搞乱sys.path
诡计.我只是做了......
# mod2.py
import some_app
Run Code Online (Sandbox Code Playgroud)
现在,当我从命令行运行mod2.py时
some_app $ python mod2.py
Run Code Online (Sandbox Code Playgroud)
它会引发错误 ImportError: No module named some_app
但是,在out.py
文件内部,当我这样做时
# out.py
import some_app.mod2
Run Code Online (Sandbox Code Playgroud)
然后呢
some_app $ python out.py
Run Code Online (Sandbox Code Playgroud)
它完美运行.
因此,正在发生的事情就是这样.我在一个模块中加载一个包在同一个包中,然后将该模块作为__main__
文件运行- 它不起作用.接下来,我__main__
在另一个模块中加载相同的模块(我运行的模块),然后运行另一个模块__main__
- 它可以工作.
有人可以详细说明这里发生了什么吗?
UPDATE
我知道没有直接的理由这样做 - 因为我可以直接导入some_app
包内的任何模块.我之所以这样做是因为,在Django项目中,这就是他们正在做的事情.例如,请参阅此文件
在每个模块中,所有非标准导入都以django.
.所以我想知道他们为什么以及如何做到这一点.
更新2
相关链接
__getattribute__
需要仔细编写该方法以避免无限循环.例如:
class A:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
return self.x
>>> a = A()
>>> a.x # infinite looop
RuntimeError: maximum recursion depth exceeded while calling a Python object
class B:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
return self.__dict__[x]
>>> b = B()
>>> b.x # infinite looop
RuntimeError: maximum recursion depth exceeded while calling a Python object
Run Code Online (Sandbox Code Playgroud)
因此我们需要以这种方式编写方法:
class C:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
# 1. error
# AttributeError: …
Run Code Online (Sandbox Code Playgroud) 我在Redis中存储一个列表,如下所示:
redis.lpush('foo', [1,2,3,4,5,6,7,8,9])
Run Code Online (Sandbox Code Playgroud)
然后我得到这样的列表:
redis.lrange('foo', 0, -1)
Run Code Online (Sandbox Code Playgroud)
我得到这样的东西:
[b'[1, 2, 3, 4, 5, 6, 7, 8, 9]']
Run Code Online (Sandbox Code Playgroud)
如何将其转换为实际的Python列表?
另外,我没有看到任何定义RESPONSE_CALLBACKS
可以帮助?我错过了什么吗?
一个可能的解决方案(在我看来很糟糕)可以是:
result = redis.lrange('foo',0, -1)[0].decode()
result = result.strip('[]')
result = result.split(', ')
# lastly, if you know all your items in the list are integers
result = [int(x) for x in result]
Run Code Online (Sandbox Code Playgroud)
UPDATE
好的,所以我得到了解决方案.
实际上,该lpush
函数希望所有列表项都作为参数传递,而不是作为单个列表传递.来自redis-py源的函数签名清楚地表明......
def lpush(self, name, *values):
"Push ``values`` onto the head of the list ``name``"
return self.execute_command('LPUSH', name, *values)
Run Code Online (Sandbox Code Playgroud)
我上面做的是发送一个列表作为参数,然后作为SINGLE项发送到redis.
我应该按照答案中的建议解压缩列表:
redis.lpush('foo', *[1,2,3,4,5,6,7,8,9])
Run Code Online (Sandbox Code Playgroud)
返回我期望的结果...... …
我们来举个例子吧.
以下是VOLUME
该指令nginx
的图像:
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
当您启动容器时,这些目录是否会显示在我的主机上?当我停止我的容器时,目录将保留?
如果我的主机中已存在某些(或所有)这些目录,会发生什么?例如,假设图像/etc/nginx
在容器目录中附带了一个默认配置文件/etc/nginx
,我的主机上也有一个配置文件.当容器启动时,哪些文件将获得优先权?
-v /host/dir:container/dir
和之间的关键区别是VOLUME
什么?
参考文献:
我试图将我的superagent post请求中的内容类型发送到multipart/form-data.
var myagent = superagent.agent();
myagent
.post('http://localhost/endpoint')
.set('api_key', apikey)
.set('Content-Type', 'multipart/form-data')
.send(fields)
.end(function(error, response){
if(error) {
console.log("Error: " + error);
}
});
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:TypeError:参数必须是一个字符串
如果我删除:
.set('Content-Type', 'multipart/form-data')
Run Code Online (Sandbox Code Playgroud)
我没有得到任何错误,但我的后端正在接收内容类型的请求:application/json
如何强制内容类型为multipart/form-data,以便我可以访问req.files()?
python ×7
python-3.x ×4
docker ×1
dockerfile ×1
nginx ×1
node.js ×1
redis ×1
shebang ×1
shell ×1
sqlite ×1
superagent ×1